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
@@ -0,0 +1,189 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::DHCP::Ack do
|
6
|
+
Pio::DHCP::Ack == Pio::Dhcp::Ack
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Dhcp::Ack, '.new' do
|
10
|
+
context 'with optional options' do
|
11
|
+
subject do
|
12
|
+
Pio::Dhcp::Ack.new(
|
13
|
+
source_mac: source_mac,
|
14
|
+
destination_mac: destination_mac,
|
15
|
+
ip_source_address: ip_source_address,
|
16
|
+
ip_destination_address: ip_destination_address,
|
17
|
+
transaction_id: 0xdeadbeef,
|
18
|
+
renewal_time_value: 0xdeadbeef,
|
19
|
+
rebinding_time_value: 0xdeadbeef,
|
20
|
+
ip_address_lease_time: 0xdeadbeef,
|
21
|
+
subnet_mask: subnet_mask
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
dhcp_ack_dump =
|
26
|
+
[
|
27
|
+
# Destination MAC Address
|
28
|
+
0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
|
29
|
+
# Source MAC Address
|
30
|
+
0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
|
31
|
+
# Ethernet Type
|
32
|
+
0x08, 0x00,
|
33
|
+
# IP version and IP Header Length
|
34
|
+
0x45,
|
35
|
+
# DSCP
|
36
|
+
0x00,
|
37
|
+
# IP Total Length
|
38
|
+
0x01, 0x48,
|
39
|
+
# IP Identifier
|
40
|
+
0x00, 0x00,
|
41
|
+
# IP Flags and IP Fragmentation
|
42
|
+
0x00, 0x00,
|
43
|
+
# IP TTL
|
44
|
+
0x80,
|
45
|
+
# IP Protocol
|
46
|
+
0x11,
|
47
|
+
# IP Header Checksum
|
48
|
+
0xb8, 0x49,
|
49
|
+
# IP Source Address
|
50
|
+
0xc0, 0xa8, 0x00, 0x0a,
|
51
|
+
# IP Destination Address
|
52
|
+
0xc0, 0xa8, 0x00, 0x01,
|
53
|
+
# UDP Source Port
|
54
|
+
0x00, 0x43,
|
55
|
+
# UDP Destination Port
|
56
|
+
0x00, 0x44,
|
57
|
+
# UDP Total Length
|
58
|
+
0x01, 0x34,
|
59
|
+
# UDP Header Checksum
|
60
|
+
0x1b, 0x64,
|
61
|
+
# Bootp Msg Type
|
62
|
+
0x02,
|
63
|
+
# Hw Type
|
64
|
+
0x01,
|
65
|
+
# Hw Address Length
|
66
|
+
0x06,
|
67
|
+
# Hops
|
68
|
+
0x00,
|
69
|
+
# Transaction ID
|
70
|
+
0xde, 0xad, 0xbe, 0xef,
|
71
|
+
# Seconds
|
72
|
+
0x00, 0x00,
|
73
|
+
# Bootp Flags
|
74
|
+
0x00, 0x00,
|
75
|
+
# Client IP Address
|
76
|
+
0x00, 0x00, 0x00, 0x00,
|
77
|
+
# Your IP Address
|
78
|
+
0xc0, 0xa8, 0x00, 0x01,
|
79
|
+
# Next Server IP Address
|
80
|
+
0x00, 0x00, 0x00, 0x00,
|
81
|
+
# Relay Agent IP Address
|
82
|
+
0x00, 0x00, 0x00, 0x00,
|
83
|
+
# Client MAC Address
|
84
|
+
0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
|
85
|
+
# Client Hw Address Padding
|
86
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
87
|
+
# Server Host Name
|
88
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
89
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
90
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
91
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
92
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
93
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
94
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
95
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
96
|
+
# Boot File Name
|
97
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
98
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
99
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
100
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
101
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
102
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
103
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
104
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
105
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
106
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
107
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
108
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
109
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
110
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
111
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
112
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
113
|
+
# Magic Cookie
|
114
|
+
0x63, 0x82, 0x53, 0x63,
|
115
|
+
# DHCP Msg Type
|
116
|
+
0x35, 0x01, 0x05,
|
117
|
+
# Renewal Time Value
|
118
|
+
0x3a, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
119
|
+
# Rebinding Time Value
|
120
|
+
0x3b, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
121
|
+
# IP Address Lease Time Value
|
122
|
+
0x33, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
123
|
+
# DHCP Server Identifier
|
124
|
+
0x36, 0x04, 0xc0, 0xa8, 0x00, 0x0a,
|
125
|
+
# Subnet Mask
|
126
|
+
0x01, 0x04, 0xff, 0xff, 0xff, 0x00,
|
127
|
+
# End Option
|
128
|
+
0xff,
|
129
|
+
# Padding Field
|
130
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
131
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
132
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
133
|
+
0x00, 0x00
|
134
|
+
]
|
135
|
+
|
136
|
+
context 'with Pio::MAC Address and Pio::IPv4Address Address' do
|
137
|
+
let(:source_mac) { Pio::Mac.new('aa:bb:cc:dd:ee:ff') }
|
138
|
+
let(:destination_mac) { Pio::Mac.new('11:22:33:44:55:66') }
|
139
|
+
let(:ip_source_address) { Pio::IPv4Address.new('192.168.0.10') }
|
140
|
+
let(:ip_destination_address) { Pio::IPv4Address.new('192.168.0.1') }
|
141
|
+
let(:subnet_mask) { Pio::IPv4Address.new('255.255.255.0') }
|
142
|
+
|
143
|
+
context '#to_binary' do
|
144
|
+
it 'returns a DHCP ack binary string' do
|
145
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_ack_dump
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'returns a valid ether frame with size = 342' do
|
149
|
+
expect(subject.to_binary.size).to eq 342
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'with String MAC Address' do
|
155
|
+
let(:source_mac) { 'aa:bb:cc:dd:ee:ff' }
|
156
|
+
let(:destination_mac) { '11:22:33:44:55:66' }
|
157
|
+
let(:ip_source_address) { '192.168.0.10' }
|
158
|
+
let(:ip_destination_address) { '192.168.0.1' }
|
159
|
+
let(:subnet_mask) { '255.255.255.0' }
|
160
|
+
|
161
|
+
context '#to_binary' do
|
162
|
+
it 'returns a DHCP ack binary string' do
|
163
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_ack_dump
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'returns a valid ether frame with size = 342' do
|
167
|
+
expect(subject.to_binary.size).to eq 342
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'without optional options' do
|
174
|
+
subject do
|
175
|
+
Pio::Dhcp::Ack.new(
|
176
|
+
source_mac: 'aa:bb:cc:dd:ee:ff',
|
177
|
+
destination_mac: '11:22:33:44:55:66',
|
178
|
+
ip_source_address: '192.168.0.10',
|
179
|
+
ip_destination_address: '192.168.0.1'
|
180
|
+
)
|
181
|
+
end
|
182
|
+
|
183
|
+
describe '#to_binary' do
|
184
|
+
it 'returns a valid ether frame with size = 342' do
|
185
|
+
expect(subject.to_binary.size).to eq 342
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::DHCP::Discover do
|
6
|
+
Then { Pio::DHCP::Discover == Pio::Dhcp::Discover }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Dhcp::Discover, '.new' do
|
10
|
+
context 'with :transaction_id' do
|
11
|
+
subject do
|
12
|
+
Pio::Dhcp::Discover.new(
|
13
|
+
source_mac: source_mac,
|
14
|
+
transaction_id: 0xdeadbeef
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
dhcp_discover_dump =
|
19
|
+
[
|
20
|
+
# Destination MAC Address
|
21
|
+
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
22
|
+
# Source MAC Address
|
23
|
+
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
24
|
+
# Ethernet Type
|
25
|
+
0x08, 0x00,
|
26
|
+
# IP version and IP Header Length
|
27
|
+
0x45,
|
28
|
+
# DSCP
|
29
|
+
0x00,
|
30
|
+
# IP Total Length
|
31
|
+
0x01, 0x48,
|
32
|
+
# IP Identifier
|
33
|
+
0x00, 0x00,
|
34
|
+
# IP Flags and IP Fragmentation
|
35
|
+
0x00, 0x00,
|
36
|
+
# IP TTL
|
37
|
+
0x80,
|
38
|
+
# IP Protocol
|
39
|
+
0x11,
|
40
|
+
# IP Header Checksum
|
41
|
+
0x39, 0xa6,
|
42
|
+
# IP Source Address
|
43
|
+
0x00, 0x00, 0x00, 0x00,
|
44
|
+
# IP Destination Address
|
45
|
+
0xff, 0xff, 0xff, 0xff,
|
46
|
+
# UDP Source Port
|
47
|
+
0x00, 0x44,
|
48
|
+
# UDP Destination Port
|
49
|
+
0x00, 0x43,
|
50
|
+
# UDP Total Length
|
51
|
+
0x01, 0x34,
|
52
|
+
# UDP Header Checksum
|
53
|
+
0x88, 0x14,
|
54
|
+
# Bootp Msg Type
|
55
|
+
0x01,
|
56
|
+
# Hw Type
|
57
|
+
0x01,
|
58
|
+
# Hw Address Length
|
59
|
+
0x06,
|
60
|
+
# Hops
|
61
|
+
0x00,
|
62
|
+
# Transaction ID
|
63
|
+
0xde, 0xad, 0xbe, 0xef,
|
64
|
+
# Seconds
|
65
|
+
0x00, 0x00,
|
66
|
+
# Bootp Flags
|
67
|
+
0x00, 0x00,
|
68
|
+
# Client IP Address
|
69
|
+
0x00, 0x00, 0x00, 0x00,
|
70
|
+
# Your IP Address
|
71
|
+
0x00, 0x00, 0x00, 0x00,
|
72
|
+
# Next Server IP Address
|
73
|
+
0x00, 0x00, 0x00, 0x00,
|
74
|
+
# Relay Agent IP Address
|
75
|
+
0x00, 0x00, 0x00, 0x00,
|
76
|
+
# Client MAC Address
|
77
|
+
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
78
|
+
# Client Hw Address Padding
|
79
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
80
|
+
# Server Host Name
|
81
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
82
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
83
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
84
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
85
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
86
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
87
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
88
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
89
|
+
# Boot File Name
|
90
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
91
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
92
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
93
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
94
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
95
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
96
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
97
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
98
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
99
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
100
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
101
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
102
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
103
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
104
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
105
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
106
|
+
# Magic Cookie
|
107
|
+
0x63, 0x82, 0x53, 0x63,
|
108
|
+
# DHCP Msg Type
|
109
|
+
0x35, 0x01, 0x01,
|
110
|
+
# Client Identifier
|
111
|
+
0x3d, 0x07, 0x01, 0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
112
|
+
# Requested IP Address
|
113
|
+
0x32, 0x04, 0x00, 0x00, 0x00, 0x00,
|
114
|
+
# Parameter Lists
|
115
|
+
0x37, 0x04, 0x01, 0x03, 0x06, 0x2a,
|
116
|
+
# End Option
|
117
|
+
0xff,
|
118
|
+
# Padding Field
|
119
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
120
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
121
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
122
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
123
|
+
]
|
124
|
+
|
125
|
+
context 'with MAC object Address' do
|
126
|
+
let(:source_mac) { Pio::Mac.new('24:db:ac:41:e5:5b') }
|
127
|
+
|
128
|
+
context '#to_binary' do
|
129
|
+
it 'returns a DHCP discover binary string' do
|
130
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_discover_dump
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'returns a valid ether frame with size = 342' do
|
134
|
+
expect(subject.to_binary.size).to eq 342
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'with String MAC Address' do
|
140
|
+
let(:source_mac) { '24:db:ac:41:e5:5b' }
|
141
|
+
|
142
|
+
context '#to_binary' do
|
143
|
+
it 'returns a DHCP discover binary string' do
|
144
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_discover_dump
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'returns a valid ether frame with size = 342' do
|
148
|
+
expect(subject.to_binary.size).to eq 342
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'without :transaction_id' do
|
155
|
+
subject do
|
156
|
+
Pio::Dhcp::Discover.new(source_mac: '24:db:ac:41:e5:5b')
|
157
|
+
end
|
158
|
+
|
159
|
+
describe '#transaction_id' do
|
160
|
+
it 'returns a valid randomized DHCP Transaction ID' do
|
161
|
+
expect(subject.transaction_id).to be_between(0, 0xffffffff)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::DHCP::Offer do
|
6
|
+
Pio::DHCP::Offer == Pio::Dhcp::Offer
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Dhcp::Offer, '.new' do
|
10
|
+
context 'with optional options' do
|
11
|
+
subject do
|
12
|
+
Pio::Dhcp::Offer.new(
|
13
|
+
source_mac: source_mac,
|
14
|
+
destination_mac: destination_mac,
|
15
|
+
ip_source_address: ip_source_address,
|
16
|
+
ip_destination_address: ip_destination_address,
|
17
|
+
transaction_id: 0xdeadbeef,
|
18
|
+
renewal_time_value: 0xdeadbeef,
|
19
|
+
rebinding_time_value: 0xdeadbeef,
|
20
|
+
ip_address_lease_time: 0xdeadbeef,
|
21
|
+
subnet_mask: subnet_mask
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
dhcp_offer_dump =
|
26
|
+
[
|
27
|
+
# Destination MAC Address
|
28
|
+
0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
|
29
|
+
# Source MAC Address
|
30
|
+
0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
|
31
|
+
# Ethernet Type
|
32
|
+
0x08, 0x00,
|
33
|
+
# IP version and IP Header Length
|
34
|
+
0x45,
|
35
|
+
# DSCP
|
36
|
+
0x00,
|
37
|
+
# IP Total Length
|
38
|
+
0x01, 0x48,
|
39
|
+
# IP Identifier
|
40
|
+
0x00, 0x00,
|
41
|
+
# IP Flags and IP Fragmentation
|
42
|
+
0x00, 0x00,
|
43
|
+
# IP TTL
|
44
|
+
0x80,
|
45
|
+
# IP Protocol
|
46
|
+
0x11,
|
47
|
+
# IP Header Checksum
|
48
|
+
0xb8, 0x49,
|
49
|
+
# IP Source Address
|
50
|
+
0xc0, 0xa8, 0x00, 0x0a,
|
51
|
+
# IP Destination Address
|
52
|
+
0xc0, 0xa8, 0x00, 0x01,
|
53
|
+
# UDP Source Port
|
54
|
+
0x00, 0x43,
|
55
|
+
# UDP Destination Port
|
56
|
+
0x00, 0x44,
|
57
|
+
# UDP Total Length
|
58
|
+
0x01, 0x34,
|
59
|
+
# UDP Header Checksum
|
60
|
+
0x1e, 0x64,
|
61
|
+
# Bootp Msg Type
|
62
|
+
0x02,
|
63
|
+
# Hw Type
|
64
|
+
0x01,
|
65
|
+
# Hw Address Length
|
66
|
+
0x06,
|
67
|
+
# Hops
|
68
|
+
0x00,
|
69
|
+
# Transaction ID
|
70
|
+
0xde, 0xad, 0xbe, 0xef,
|
71
|
+
# Seconds
|
72
|
+
0x00, 0x00,
|
73
|
+
# Bootp Flags
|
74
|
+
0x00, 0x00,
|
75
|
+
# Client IP Address
|
76
|
+
0x00, 0x00, 0x00, 0x00,
|
77
|
+
# Your IP Address
|
78
|
+
0xc0, 0xa8, 0x00, 0x01,
|
79
|
+
# Next Server IP Address
|
80
|
+
0x00, 0x00, 0x00, 0x00,
|
81
|
+
# Relay Agent IP Address
|
82
|
+
0x00, 0x00, 0x00, 0x00,
|
83
|
+
# Client MAC Address
|
84
|
+
0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
|
85
|
+
# Client Hw Address Padding
|
86
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
87
|
+
# Server Host Name
|
88
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
89
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
90
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
91
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
92
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
93
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
94
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
95
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
96
|
+
# Boot File Name
|
97
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
98
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
99
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
100
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
101
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
102
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
103
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
104
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
105
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
106
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
107
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
108
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
109
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
110
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
111
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
112
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
113
|
+
# Magic Cookie
|
114
|
+
0x63, 0x82, 0x53, 0x63,
|
115
|
+
# DHCP Msg Type
|
116
|
+
0x35, 0x01, 0x02,
|
117
|
+
# Renewal Time Value
|
118
|
+
0x3a, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
119
|
+
# Rebinding Time Value
|
120
|
+
0x3b, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
121
|
+
# IP Address Lease Time Value
|
122
|
+
0x33, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
123
|
+
# DHCP Server Identifier
|
124
|
+
0x36, 0x04, 0xc0, 0xa8, 0x00, 0x0a,
|
125
|
+
# Subnet Mask
|
126
|
+
0x01, 0x04, 0xff, 0xff, 0xff, 0x00,
|
127
|
+
# End Option
|
128
|
+
0xff,
|
129
|
+
# Padding Field
|
130
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
131
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
132
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
133
|
+
0x00, 0x00
|
134
|
+
]
|
135
|
+
|
136
|
+
context 'with Pio::MAC Address and Pio::IPv4Address Address' do
|
137
|
+
let(:source_mac) { Pio::Mac.new('aa:bb:cc:dd:ee:ff') }
|
138
|
+
let(:destination_mac) { Pio::Mac.new('11:22:33:44:55:66') }
|
139
|
+
let(:ip_source_address) { Pio::IPv4Address.new('192.168.0.10') }
|
140
|
+
let(:ip_destination_address) { Pio::IPv4Address.new('192.168.0.1') }
|
141
|
+
let(:subnet_mask) { Pio::IPv4Address.new('255.255.255.0') }
|
142
|
+
|
143
|
+
context '#to_binary' do
|
144
|
+
it 'returns a DHCP ack binary string' do
|
145
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_offer_dump
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'returns a valid ether frame with size = 342' do
|
149
|
+
expect(subject.to_binary.size).to eq 342
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'with String MAC Address' do
|
155
|
+
let(:source_mac) { 'aa:bb:cc:dd:ee:ff' }
|
156
|
+
let(:destination_mac) { '11:22:33:44:55:66' }
|
157
|
+
let(:ip_source_address) { '192.168.0.10' }
|
158
|
+
let(:ip_destination_address) { '192.168.0.1' }
|
159
|
+
let(:subnet_mask) { '255.255.255.0' }
|
160
|
+
|
161
|
+
context '#to_binary' do
|
162
|
+
it 'returns a DHCP ack binary string' do
|
163
|
+
expect(subject.to_binary.unpack('C*')).to eq dhcp_offer_dump
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'returns a valid ether frame with size = 342' do
|
167
|
+
expect(subject.to_binary.size).to eq 342
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'without optional options' do
|
174
|
+
subject do
|
175
|
+
Pio::Dhcp::Offer.new(
|
176
|
+
source_mac: 'aa:bb:cc:dd:ee:ff',
|
177
|
+
destination_mac: '11:22:33:44:55:66',
|
178
|
+
ip_source_address: '192.168.0.10',
|
179
|
+
ip_destination_address: '192.168.0.1'
|
180
|
+
)
|
181
|
+
end
|
182
|
+
|
183
|
+
describe '#to_binary' do
|
184
|
+
it 'returns a valid ether frame with size = 342' do
|
185
|
+
expect(subject.to_binary.size).to eq 342
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|