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/spec/pio/icmp/reply_spec.rb
CHANGED
@@ -1,132 +1,139 @@
|
|
1
|
-
#
|
2
|
-
require 'pio/icmp/reply'
|
1
|
+
# encoding: utf-8
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::ICMP::Reply do
|
6
|
+
Then { Pio::ICMP::Reply == Pio::Icmp::Reply }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Icmp::Reply, '.new' do
|
10
|
+
context 'with echo_data' do
|
11
|
+
Given(:icmp_reply) do
|
7
12
|
Pio::Icmp::Reply.new(
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
14
|
+
source_mac: '24:db:ac:41:e5:5b',
|
15
|
+
ip_source_address: '8.8.8.8',
|
16
|
+
ip_destination_address: '192.168.1.102',
|
17
|
+
identifier: 0x123,
|
18
|
+
sequence_number: 0x321,
|
19
|
+
echo_data: 'abcdefghijklmnopqrstuvwabcdefghi'
|
13
20
|
)
|
14
21
|
end
|
15
22
|
|
16
|
-
|
17
|
-
|
23
|
+
describe '#to_binary' do
|
24
|
+
When(:result) { icmp_reply.to_binary }
|
18
25
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
26
|
+
Then do
|
27
|
+
result ==
|
28
|
+
[
|
29
|
+
# Destination MAC
|
23
30
|
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1,
|
24
|
-
|
31
|
+
# Source MAC
|
25
32
|
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
26
|
-
|
33
|
+
# EtherType
|
27
34
|
0x08, 0x00,
|
28
|
-
|
35
|
+
# IP Version&IP Header Length
|
29
36
|
0x45,
|
30
|
-
|
37
|
+
# IP Type Of Service
|
31
38
|
0x00,
|
32
|
-
|
39
|
+
# IP Total Length
|
33
40
|
0x00, 0x3c,
|
34
|
-
|
41
|
+
# IP Identifier
|
35
42
|
0x00, 0x00,
|
36
|
-
|
43
|
+
# IP Flag&IP Fragment
|
37
44
|
0x00, 0x00,
|
38
|
-
|
45
|
+
# IP TTL
|
39
46
|
0x80,
|
40
|
-
|
47
|
+
# IP Protocol
|
41
48
|
0x01,
|
42
|
-
|
49
|
+
# IP Header Checksum
|
43
50
|
0x68, 0xa3,
|
44
|
-
|
51
|
+
# IP Source Address
|
45
52
|
0x08, 0x08, 0x08, 0x08,
|
46
|
-
|
53
|
+
# IP Destination Address
|
47
54
|
0xc0, 0xa8, 0x01, 0x66,
|
48
|
-
|
55
|
+
# ICMP Type
|
49
56
|
0x00,
|
50
|
-
|
57
|
+
# ICMP Code
|
51
58
|
0x00,
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
0x01,
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
# ICMP Checksum
|
60
|
+
0x51, 0x18,
|
61
|
+
# ICMP Identifier
|
62
|
+
0x01, 0x23,
|
63
|
+
# ICMP Sequence Number
|
64
|
+
0x03, 0x21,
|
65
|
+
# Echo Data
|
59
66
|
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
60
67
|
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
|
61
68
|
0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
|
62
69
|
0x76, 0x77, 0x61, 0x62, 0x63, 0x64, 0x65,
|
63
70
|
0x66, 0x67, 0x68, 0x69
|
64
|
-
]
|
65
|
-
|
66
|
-
expect(subject.to_binary.unpack('C*')).to eq valid_icmp_reply_dump
|
67
|
-
end
|
71
|
+
].pack('C*')
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
71
75
|
context 'with an empty :echo_data' do
|
72
|
-
|
76
|
+
Given(:icmp_reply) do
|
77
|
+
Pio::Icmp::Reply.new(
|
78
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
79
|
+
source_mac: '24:db:ac:41:e5:5b',
|
80
|
+
ip_source_address: '8.8.8.8',
|
81
|
+
ip_destination_address: '192.168.1.102',
|
82
|
+
identifier: 0x123,
|
83
|
+
sequence_number: 0x321
|
84
|
+
)
|
85
|
+
end
|
73
86
|
|
74
|
-
|
75
|
-
|
76
|
-
valid_icmp_reply_dump = [
|
77
|
-
# Destination MAC
|
78
|
-
# Destination MAC
|
79
|
-
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1,
|
80
|
-
# Source MAC
|
81
|
-
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
82
|
-
# EtherType
|
83
|
-
0x08, 0x00,
|
84
|
-
# IP Version&IP Header Length
|
85
|
-
0x45,
|
86
|
-
# IP Type Of Service
|
87
|
-
0x00,
|
88
|
-
# IP Total Length
|
89
|
-
0x00, 0x32,
|
90
|
-
# IP Identifier
|
91
|
-
0x00, 0x00,
|
92
|
-
# IP Flag&IP Fragment
|
93
|
-
0x00, 0x00,
|
94
|
-
# IP TTL
|
95
|
-
0x80,
|
96
|
-
# IP Protocol
|
97
|
-
0x01,
|
98
|
-
# IP Header Checksum
|
99
|
-
0x68, 0xad,
|
100
|
-
# IP Source Address
|
101
|
-
0x08, 0x08, 0x08, 0x08,
|
102
|
-
# IP Destination Address
|
103
|
-
0xc0, 0xa8, 0x01, 0x66,
|
104
|
-
# ICMP Type
|
105
|
-
0x00,
|
106
|
-
# ICMP Code
|
107
|
-
0x00,
|
108
|
-
# ICMP Checksum
|
109
|
-
0xfe, 0xfe,
|
110
|
-
# ICMP Identifier
|
111
|
-
0x01, 0x00,
|
112
|
-
# ICMP Sequence Number
|
113
|
-
0x00, 0x01,
|
114
|
-
# Echo Data
|
115
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
116
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
117
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
118
|
-
0x00, 0x00, 0x00, 0x00
|
119
|
-
]
|
87
|
+
describe '#to_binary' do
|
88
|
+
When(:result) { icmp_reply.to_binary }
|
120
89
|
|
121
|
-
|
90
|
+
Then do
|
91
|
+
result ==
|
92
|
+
[
|
93
|
+
# Destination MAC
|
94
|
+
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1,
|
95
|
+
# Source MAC
|
96
|
+
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
97
|
+
# EtherType
|
98
|
+
0x08, 0x00,
|
99
|
+
# IP Version&IP Header Length
|
100
|
+
0x45,
|
101
|
+
# IP Type Of Service
|
102
|
+
0x00,
|
103
|
+
# IP Total Length
|
104
|
+
0x00, 0x32,
|
105
|
+
# IP Identifier
|
106
|
+
0x00, 0x00,
|
107
|
+
# IP Flag&IP Fragment
|
108
|
+
0x00, 0x00,
|
109
|
+
# IP TTL
|
110
|
+
0x80,
|
111
|
+
# IP Protocol
|
112
|
+
0x01,
|
113
|
+
# IP Header Checksum
|
114
|
+
0x68, 0xad,
|
115
|
+
# IP Source Address
|
116
|
+
0x08, 0x08, 0x08, 0x08,
|
117
|
+
# IP Destination Address
|
118
|
+
0xc0, 0xa8, 0x01, 0x66,
|
119
|
+
# ICMP Type
|
120
|
+
0x00,
|
121
|
+
# ICMP Code
|
122
|
+
0x00,
|
123
|
+
# ICMP Checksum
|
124
|
+
0xfb, 0xbb,
|
125
|
+
# ICMP Identifier
|
126
|
+
0x01, 0x23,
|
127
|
+
# ICMP Sequence Number
|
128
|
+
0x03, 0x21,
|
129
|
+
# Echo Data
|
130
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
131
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
132
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
133
|
+
0x00, 0x00, 0x00, 0x00
|
134
|
+
].pack('C*')
|
122
135
|
end
|
123
136
|
end
|
124
137
|
end
|
125
138
|
end
|
126
139
|
end
|
127
|
-
|
128
|
-
### Local variables:
|
129
|
-
### mode: Ruby
|
130
|
-
### coding: utf-8-unix
|
131
|
-
### indent-tabs-mode: nil
|
132
|
-
### End:
|
@@ -1,131 +1,139 @@
|
|
1
|
-
#
|
2
|
-
require 'pio/icmp/request'
|
1
|
+
# encoding: utf-8
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::ICMP::Request do
|
6
|
+
Then { Pio::ICMP::Request == Pio::Icmp::Request }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Icmp::Request, '.new' do
|
10
|
+
context 'with echo_data' do
|
11
|
+
Given(:icmp_request) do
|
7
12
|
Pio::Icmp::Request.new(
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
+
destination_mac: '24:db:ac:41:e5:5b',
|
14
|
+
source_mac: '74:e5:0b:2a:18:f8',
|
15
|
+
ip_source_address: '192.168.1.101',
|
16
|
+
ip_destination_address: '8.8.8.8',
|
17
|
+
identifier: 0x123,
|
18
|
+
sequence_number: 0x321,
|
19
|
+
echo_data: 'abcdefghijklmnopqrstuvwabcdefghi'
|
13
20
|
)
|
14
21
|
end
|
15
22
|
|
16
|
-
|
17
|
-
|
23
|
+
describe '#to_binary' do
|
24
|
+
When(:result) { icmp_request.to_binary }
|
18
25
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
26
|
+
Then do
|
27
|
+
result ==
|
28
|
+
[
|
29
|
+
# Destination MAC
|
23
30
|
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
24
|
-
|
31
|
+
# Source MAC
|
25
32
|
0x74, 0xe5, 0x0b, 0x2a, 0x18, 0xf8,
|
26
|
-
|
33
|
+
# EtherType
|
27
34
|
0x08, 0x00,
|
28
|
-
|
35
|
+
# IP Version&IP Header Length
|
29
36
|
0x45,
|
30
|
-
|
37
|
+
# IP Type Of Service
|
31
38
|
0x00,
|
32
|
-
|
39
|
+
# IP Total Length
|
33
40
|
0x00, 0x3c,
|
34
|
-
|
41
|
+
# IP Identifier
|
35
42
|
0x00, 0x00,
|
36
|
-
|
43
|
+
# IP Flag&IP Fragment
|
37
44
|
0x00, 0x00,
|
38
|
-
|
45
|
+
# IP TTL
|
39
46
|
0x80,
|
40
|
-
|
47
|
+
# IP Protocol
|
41
48
|
0x01,
|
42
|
-
|
49
|
+
# IP Header Checksum
|
43
50
|
0x68, 0xa4,
|
44
|
-
|
51
|
+
# IP Source Address
|
45
52
|
0xc0, 0xa8, 0x01, 0x65,
|
46
|
-
|
53
|
+
# IP Destination Address
|
47
54
|
0x08, 0x08, 0x08, 0x08,
|
48
|
-
|
55
|
+
# ICMP Type
|
49
56
|
0x08,
|
50
|
-
|
57
|
+
# ICMP Code
|
51
58
|
0x00,
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
0x01,
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
# ICMP Checksum
|
60
|
+
0x49, 0x18,
|
61
|
+
# ICMP Identifier
|
62
|
+
0x01, 0x23,
|
63
|
+
# ICMP Sequence Number
|
64
|
+
0x03, 0x21,
|
65
|
+
# Echo Data
|
59
66
|
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
60
67
|
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
|
61
68
|
0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
|
62
69
|
0x76, 0x77, 0x61, 0x62, 0x63, 0x64, 0x65,
|
63
70
|
0x66, 0x67, 0x68, 0x69
|
64
|
-
]
|
65
|
-
|
66
|
-
expect(subject.to_binary.unpack('C*')).to eq valid_icmp_request_dump
|
67
|
-
end
|
71
|
+
].pack('C*')
|
68
72
|
end
|
69
73
|
end
|
74
|
+
end
|
70
75
|
|
71
|
-
|
72
|
-
|
76
|
+
context 'with empty echo_data' do
|
77
|
+
Given(:icmp_request) do
|
78
|
+
Pio::Icmp::Request.new(
|
79
|
+
destination_mac: '24:db:ac:41:e5:5b',
|
80
|
+
source_mac: '74:e5:0b:2a:18:f8',
|
81
|
+
ip_source_address: '192.168.1.101',
|
82
|
+
ip_destination_address: '8.8.8.8',
|
83
|
+
identifier: 0x123,
|
84
|
+
sequence_number: 0x321
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#to_binary' do
|
89
|
+
When(:result) { icmp_request.to_binary }
|
73
90
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
91
|
+
Then do
|
92
|
+
result ==
|
93
|
+
[
|
94
|
+
# Destination MAC
|
78
95
|
0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
|
79
|
-
|
96
|
+
# Source MAC
|
80
97
|
0x74, 0xe5, 0x0b, 0x2a, 0x18, 0xf8,
|
81
|
-
|
98
|
+
# EtherType
|
82
99
|
0x08, 0x00,
|
83
|
-
|
100
|
+
# IP Version&IP Header Length
|
84
101
|
0x45,
|
85
|
-
|
102
|
+
# IP Type Of Service
|
86
103
|
0x00,
|
87
|
-
|
104
|
+
# IP Total Length
|
88
105
|
0x00, 0x32,
|
89
|
-
|
106
|
+
# IP Identifier
|
90
107
|
0x00, 0x00,
|
91
|
-
|
108
|
+
# IP Flag&IP Fragment
|
92
109
|
0x00, 0x00,
|
93
|
-
|
110
|
+
# IP TTL
|
94
111
|
0x80,
|
95
|
-
|
112
|
+
# IP Protocol
|
96
113
|
0x01,
|
97
|
-
|
114
|
+
# IP Header Checksum
|
98
115
|
0x68, 0xae,
|
99
|
-
|
116
|
+
# IP Source Address
|
100
117
|
0xc0, 0xa8, 0x01, 0x65,
|
101
|
-
|
118
|
+
# IP Destination Address
|
102
119
|
0x08, 0x08, 0x08, 0x08,
|
103
|
-
|
120
|
+
# ICMP Type
|
104
121
|
0x08,
|
105
|
-
|
122
|
+
# ICMP Code
|
106
123
|
0x00,
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
0x01,
|
111
|
-
|
112
|
-
|
113
|
-
|
124
|
+
# ICMP Checksum
|
125
|
+
0xf3, 0xbb,
|
126
|
+
# ICMP Identifier
|
127
|
+
0x01, 0x23,
|
128
|
+
# ICMP Sequence Number
|
129
|
+
0x03, 0x21,
|
130
|
+
# Echo Data
|
114
131
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
115
132
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
116
133
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
117
134
|
0x00, 0x00, 0x00, 0x00
|
118
|
-
]
|
119
|
-
|
120
|
-
expect(subject.to_binary.unpack('C*')).to eq valid_icmp_request_dump
|
121
|
-
end
|
135
|
+
].pack('C*')
|
122
136
|
end
|
123
137
|
end
|
124
138
|
end
|
125
139
|
end
|
126
|
-
|
127
|
-
### Local variables:
|
128
|
-
### mode: Ruby
|
129
|
-
### coding: utf-8-unix
|
130
|
-
### indent-tabs-mode: nil
|
131
|
-
### End:
|