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.
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