pio 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +46 -12
  3. data/README.md +131 -116
  4. data/Rakefile +7 -92
  5. data/examples/arp_new.rb +16 -0
  6. data/examples/arp_read.rb +4 -0
  7. data/examples/dhcp_new.rb +30 -0
  8. data/examples/dhcp_read.rb +4 -0
  9. data/examples/icmp_new.rb +21 -0
  10. data/examples/icmp_read.rb +4 -0
  11. data/examples/lldp_new.rb +4 -0
  12. data/examples/lldp_read.rb +4 -0
  13. data/lib/pio.rb +6 -12
  14. data/lib/pio/arp.rb +7 -19
  15. data/lib/pio/arp/frame.rb +8 -12
  16. data/lib/pio/arp/message.rb +12 -25
  17. data/lib/pio/arp/reply.rb +30 -30
  18. data/lib/pio/arp/request.rb +30 -29
  19. data/lib/pio/dhcp.rb +58 -0
  20. data/lib/pio/dhcp/ack.rb +12 -0
  21. data/lib/pio/dhcp/boot_reply.rb +16 -0
  22. data/lib/pio/dhcp/boot_reply_options.rb +75 -0
  23. data/lib/pio/dhcp/boot_request.rb +16 -0
  24. data/lib/pio/dhcp/boot_request_options.rb +69 -0
  25. data/lib/pio/dhcp/common_options.rb +71 -0
  26. data/lib/pio/dhcp/csum_util.rb +83 -0
  27. data/lib/pio/dhcp/dhcp_field.rb +48 -0
  28. data/lib/pio/dhcp/dhcp_tlv_options.rb +84 -0
  29. data/lib/pio/dhcp/discover.rb +12 -0
  30. data/lib/pio/dhcp/field_util.rb +102 -0
  31. data/lib/pio/dhcp/frame.rb +95 -0
  32. data/lib/pio/dhcp/message.rb +79 -0
  33. data/lib/pio/dhcp/offer.rb +12 -0
  34. data/lib/pio/dhcp/optional_tlv.rb +74 -0
  35. data/lib/pio/dhcp/request.rb +12 -0
  36. data/lib/pio/dhcp/type/dhcp_client_id.rb +21 -0
  37. data/lib/pio/dhcp/type/dhcp_param_list.rb +22 -0
  38. data/lib/pio/dhcp/type/dhcp_string.rb +21 -0
  39. data/lib/pio/icmp.rb +7 -18
  40. data/lib/pio/icmp/frame.rb +38 -40
  41. data/lib/pio/icmp/message.rb +10 -61
  42. data/lib/pio/icmp/options.rb +25 -0
  43. data/lib/pio/icmp/reply.rb +34 -7
  44. data/lib/pio/icmp/request.rb +43 -7
  45. data/lib/pio/ipv4_address.rb +5 -8
  46. data/lib/pio/lldp.rb +22 -62
  47. data/lib/pio/lldp/chassis_id_tlv.rb +7 -13
  48. data/lib/pio/lldp/end_of_lldpdu_value.rb +3 -9
  49. data/lib/pio/lldp/frame.rb +6 -12
  50. data/lib/pio/lldp/management_address_value.rb +4 -10
  51. data/lib/pio/lldp/optional_tlv.rb +5 -10
  52. data/lib/pio/lldp/options.rb +37 -0
  53. data/lib/pio/lldp/organizationally_specific_value.rb +2 -8
  54. data/lib/pio/lldp/port_description_value.rb +2 -8
  55. data/lib/pio/lldp/port_id_tlv.rb +6 -12
  56. data/lib/pio/lldp/system_capabilities_value.rb +2 -8
  57. data/lib/pio/lldp/system_description_value.rb +2 -8
  58. data/lib/pio/lldp/system_name_value.rb +2 -8
  59. data/lib/pio/lldp/ttl_tlv.rb +5 -11
  60. data/lib/pio/mac.rb +4 -9
  61. data/lib/pio/message_type_selector.rb +22 -0
  62. data/lib/pio/options.rb +65 -0
  63. data/lib/pio/parse_error.rb +6 -0
  64. data/lib/pio/type/ethernet_header.rb +3 -2
  65. data/lib/pio/type/ip_address.rb +4 -9
  66. data/lib/pio/type/ipv4_header.rb +12 -17
  67. data/lib/pio/type/mac_address.rb +5 -10
  68. data/lib/pio/type/udp_header.rb +18 -0
  69. data/lib/pio/version.rb +3 -8
  70. data/pio.gemspec +12 -10
  71. data/spec/pio/arp/reply/options_spec.rb +145 -0
  72. data/spec/pio/arp/reply_spec.rb +77 -113
  73. data/spec/pio/arp/request/options_spec.rb +115 -0
  74. data/spec/pio/arp/request_spec.rb +74 -96
  75. data/spec/pio/arp_spec.rb +71 -105
  76. data/spec/pio/dhcp/ack_spec.rb +189 -0
  77. data/spec/pio/dhcp/discover_spec.rb +165 -0
  78. data/spec/pio/dhcp/offer_spec.rb +189 -0
  79. data/spec/pio/dhcp/request_spec.rb +173 -0
  80. data/spec/pio/dhcp_spec.rb +609 -0
  81. data/spec/pio/icmp/reply_spec.rb +102 -95
  82. data/spec/pio/icmp/request_spec.rb +86 -78
  83. data/spec/pio/icmp_spec.rb +153 -146
  84. data/spec/pio/ipv4_address_spec.rb +2 -7
  85. data/spec/pio/lldp/options_spec.rb +188 -0
  86. data/spec/pio/lldp_spec.rb +181 -208
  87. data/spec/pio/mac_spec.rb +3 -8
  88. data/spec/spec_helper.rb +4 -10
  89. metadata +69 -17
  90. data/.gitignore +0 -20
  91. data/.rspec +0 -3
  92. data/.rubocop.yml +0 -1
  93. data/.travis.yml +0 -13
  94. data/Gemfile +0 -37
  95. data/Guardfile +0 -24
  96. data/lib/pio/message_util.rb +0 -19
  97. data/lib/pio/type/config.reek +0 -4
  98. data/lib/pio/util.rb +0 -21
  99. data/pio.org +0 -668
  100. data/pio.org_archive +0 -943
  101. 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