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