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