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
@@ -1,132 +1,139 @@
1
- # -*- coding: utf-8 -*-
2
- require 'pio/icmp/reply'
1
+ # encoding: utf-8
3
2
 
4
- describe Pio::Icmp::Reply do
5
- context '.new' do
6
- subject do
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
- :destination_mac => '00:26:82:eb:ea:d1',
9
- :source_mac => '24:db:ac:41:e5:5b',
10
- :ip_source_address => '8.8.8.8',
11
- :ip_destination_address => '192.168.1.102',
12
- :echo_data => echo_data
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
- context 'with :echo_data' do
17
- let(:echo_data) { 'abcdefghijklmnopqrstuvwabcdefghi' }
23
+ describe '#to_binary' do
24
+ When(:result) { icmp_reply.to_binary }
18
25
 
19
- context '#to_binary' do
20
- it 'returns an ICMP reply binary string' do
21
- valid_icmp_reply_dump = [
22
- # Destination MAC
26
+ Then do
27
+ result ==
28
+ [
29
+ # Destination MAC
23
30
  0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1,
24
- # Source MAC
31
+ # Source MAC
25
32
  0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
26
- # EtherType
33
+ # EtherType
27
34
  0x08, 0x00,
28
- # IP Version&IP Header Length
35
+ # IP Version&IP Header Length
29
36
  0x45,
30
- # IP Type Of Service
37
+ # IP Type Of Service
31
38
  0x00,
32
- # IP Total Length
39
+ # IP Total Length
33
40
  0x00, 0x3c,
34
- # IP Identifier
41
+ # IP Identifier
35
42
  0x00, 0x00,
36
- # IP Flag&IP Fragment
43
+ # IP Flag&IP Fragment
37
44
  0x00, 0x00,
38
- # IP TTL
45
+ # IP TTL
39
46
  0x80,
40
- # IP Protocol
47
+ # IP Protocol
41
48
  0x01,
42
- # IP Header Checksum
49
+ # IP Header Checksum
43
50
  0x68, 0xa3,
44
- # IP Source Address
51
+ # IP Source Address
45
52
  0x08, 0x08, 0x08, 0x08,
46
- # IP Destination Address
53
+ # IP Destination Address
47
54
  0xc0, 0xa8, 0x01, 0x66,
48
- # ICMP Type
55
+ # ICMP Type
49
56
  0x00,
50
- # ICMP Code
57
+ # ICMP Code
51
58
  0x00,
52
- # ICMP Checksum
53
- 0x54, 0x5b,
54
- # ICMP Identifier
55
- 0x01, 0x00,
56
- # ICMP Sequence Number
57
- 0x00, 0x01,
58
- # Echo Data
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
- let(:echo_data) { '' }
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
- context '#to_binary' do
75
- it 'returns an ICMP reply binary string' do
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
- expect(subject.to_binary.unpack('C*')).to eq valid_icmp_reply_dump
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
- # -*- coding: utf-8 -*-
2
- require 'pio/icmp/request'
1
+ # encoding: utf-8
3
2
 
4
- describe Pio::Icmp::Request do
5
- context '.new' do
6
- subject do
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
- :destination_mac => '24:db:ac:41:e5:5b',
9
- :source_mac => '74:e5:0b:2a:18:f8',
10
- :ip_source_address => '192.168.1.101',
11
- :ip_destination_address => '8.8.8.8',
12
- :echo_data => echo_data
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
- context 'with :echo_data' do
17
- let(:echo_data) { 'abcdefghijklmnopqrstuvwabcdefghi' }
23
+ describe '#to_binary' do
24
+ When(:result) { icmp_request.to_binary }
18
25
 
19
- context '#to_binary' do
20
- it 'returns an ICMP request binary string' do
21
- valid_icmp_request_dump = [
22
- # Destination MAC
26
+ Then do
27
+ result ==
28
+ [
29
+ # Destination MAC
23
30
  0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
24
- # Source MAC
31
+ # Source MAC
25
32
  0x74, 0xe5, 0x0b, 0x2a, 0x18, 0xf8,
26
- # EtherType
33
+ # EtherType
27
34
  0x08, 0x00,
28
- # IP Version&IP Header Length
35
+ # IP Version&IP Header Length
29
36
  0x45,
30
- # IP Type Of Service
37
+ # IP Type Of Service
31
38
  0x00,
32
- # IP Total Length
39
+ # IP Total Length
33
40
  0x00, 0x3c,
34
- # IP Identifier
41
+ # IP Identifier
35
42
  0x00, 0x00,
36
- # IP Flag&IP Fragment
43
+ # IP Flag&IP Fragment
37
44
  0x00, 0x00,
38
- # IP TTL
45
+ # IP TTL
39
46
  0x80,
40
- # IP Protocol
47
+ # IP Protocol
41
48
  0x01,
42
- # IP Header Checksum
49
+ # IP Header Checksum
43
50
  0x68, 0xa4,
44
- # IP Source Address
51
+ # IP Source Address
45
52
  0xc0, 0xa8, 0x01, 0x65,
46
- # IP Destination Address
53
+ # IP Destination Address
47
54
  0x08, 0x08, 0x08, 0x08,
48
- # ICMP Type
55
+ # ICMP Type
49
56
  0x08,
50
- # ICMP Code
57
+ # ICMP Code
51
58
  0x00,
52
- # ICMP Checksum
53
- 0x4c, 0x5b,
54
- # ICMP Identifier
55
- 0x01, 0x00,
56
- # ICMP Sequence Number
57
- 0x00, 0x01,
58
- # Echo Data
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
- context 'with an emply :echo_data' do
72
- let(:echo_data) { '' }
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
- context '#to_binary' do
75
- it 'returns an ICMP request binary string' do
76
- valid_icmp_request_dump = [
77
- # Destination MAC
91
+ Then do
92
+ result ==
93
+ [
94
+ # Destination MAC
78
95
  0x24, 0xdb, 0xac, 0x41, 0xe5, 0x5b,
79
- # Source MAC
96
+ # Source MAC
80
97
  0x74, 0xe5, 0x0b, 0x2a, 0x18, 0xf8,
81
- # EtherType
98
+ # EtherType
82
99
  0x08, 0x00,
83
- # IP Version&IP Header Length
100
+ # IP Version&IP Header Length
84
101
  0x45,
85
- # IP Type Of Service
102
+ # IP Type Of Service
86
103
  0x00,
87
- # IP Total Length
104
+ # IP Total Length
88
105
  0x00, 0x32,
89
- # IP Identifier
106
+ # IP Identifier
90
107
  0x00, 0x00,
91
- # IP Flag&IP Fragment
108
+ # IP Flag&IP Fragment
92
109
  0x00, 0x00,
93
- # IP TTL
110
+ # IP TTL
94
111
  0x80,
95
- # IP Protocol
112
+ # IP Protocol
96
113
  0x01,
97
- # IP Header Checksum
114
+ # IP Header Checksum
98
115
  0x68, 0xae,
99
- # IP Source Address
116
+ # IP Source Address
100
117
  0xc0, 0xa8, 0x01, 0x65,
101
- # IP Destination Address
118
+ # IP Destination Address
102
119
  0x08, 0x08, 0x08, 0x08,
103
- # ICMP Type
120
+ # ICMP Type
104
121
  0x08,
105
- # ICMP Code
122
+ # ICMP Code
106
123
  0x00,
107
- # ICMP Checksum
108
- 0xf6, 0xfe,
109
- # ICMP Identifier
110
- 0x01, 0x00,
111
- # ICMP Sequence Number
112
- 0x00, 0x01,
113
- # Echo Data
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: