pio 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,82 @@
1
+ require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
2
+ require "pio/mac"
3
+
4
+
5
+ module Pio
6
+ describe Mac do
7
+ context ".new" do
8
+ subject { Mac.new( value ) }
9
+
10
+
11
+ context %{with "11:22:33:44:55:66"} do
12
+ let( :value ) { "11:22:33:44:55:66" }
13
+ it { should eq Mac.new( "11:22:33:44:55:66" ) }
14
+ its( :value ) { should eq 0x112233445566 }
15
+ its( :to_s ) { should eq "11:22:33:44:55:66" }
16
+ its( :to_a ) { should eq [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ] }
17
+ its( :multicast? ){ should be_true }
18
+ its( :broadcast? ){ should be_false }
19
+ end
20
+
21
+
22
+ context "with 0" do
23
+ let( :value ) { 0 }
24
+ it { should eq Mac.new( 0 ) }
25
+ its( :value ) { should eq 0 }
26
+ its( :to_s ) { should eq "00:00:00:00:00:00" }
27
+ its( :to_a ) { should eq [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] }
28
+ its( :multicast? ){ should be_false }
29
+ its( :broadcast? ){ should be_false }
30
+ end
31
+
32
+
33
+ context "with 0xffffffffffff" do
34
+ let( :value ) { 0xffffffffffff }
35
+ it { should eq Mac.new( 0xffffffffffff ) }
36
+ its( :value ) { should eq 0xffffffffffff }
37
+ its( :to_s ) { should eq "ff:ff:ff:ff:ff:ff" }
38
+ its( :to_a ) { should eq [ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ] }
39
+ its( :multicast? ){ should be_true }
40
+ its( :broadcast? ){ should be_true }
41
+ end
42
+
43
+
44
+ context %{with "INVALID MAC ADDRESS"} do
45
+ let( :value ) { "INVALID MAC ADDRESS" }
46
+ it { expect { subject }.to raise_error( ArgumentError ) }
47
+ end
48
+
49
+
50
+ context "with -1" do
51
+ let( :value ) { -1 }
52
+ it { expect { subject }.to raise_error( ArgumentError ) }
53
+ end
54
+
55
+
56
+ context "with 0x1000000000000" do
57
+ let( :value ) { 0x1000000000000 }
58
+ it { expect { subject }.to raise_error( ArgumentError ) }
59
+ end
60
+
61
+
62
+ context "with [ 1, 2, 3 ]" do
63
+ let( :value ) { [ 1, 2, 3 ] }
64
+ it { expect { subject }.to raise_error( TypeError ) }
65
+ end
66
+
67
+
68
+ context %{with "00:00:00:00:00:01"} do
69
+ let( :value ) { "00:00:00:00:00:01" }
70
+ it { expect( subject ).to eql Mac.new( "00:00:00:00:00:01" ) }
71
+ its( :hash ) { should eq Mac.new( "00:00:00:00:00:01" ).hash }
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+
78
+ ### Local variables:
79
+ ### mode: Ruby
80
+ ### coding: utf-8-unix
81
+ ### indent-tabs-mode: nil
82
+ ### End:
@@ -1,3 +1,5 @@
1
+ $LOAD_PATH.unshift File.join( File.dirname( __FILE__ ), "..", "lib" )
2
+
1
3
  require "rubygems"
2
4
 
3
5
  require "simplecov"
@@ -7,6 +9,13 @@ require "rspec"
7
9
  require "rspec/autorun"
8
10
 
9
11
 
12
+ RSpec.configure do | config |
13
+ config.expect_with :rspec do | c |
14
+ c.syntax = :expect
15
+ end
16
+ end
17
+
18
+
10
19
  # Requires supporting files with custom matchers and macros, etc,
11
20
  # in ./support/ and its subdirectories.
12
21
  Dir[ "#{ File.dirname( __FILE__ ) }/support/**/*.rb" ].each do | each |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhito Takamiya
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-05 00:00:00.000000000 Z
11
+ date: 2013-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -33,35 +33,47 @@ extra_rdoc_files:
33
33
  - README.md
34
34
  files:
35
35
  - .gitignore
36
+ - .rspec
36
37
  - .travis.yml
37
38
  - Gemfile
38
39
  - Guardfile
39
40
  - LICENSE
40
41
  - README.md
41
42
  - Rakefile
43
+ - lib/pio.rb
44
+ - lib/pio/arp.rb
45
+ - lib/pio/arp/frame.rb
46
+ - lib/pio/arp/message.rb
47
+ - lib/pio/arp/reply.rb
48
+ - lib/pio/arp/request.rb
49
+ - lib/pio/ip.rb
42
50
  - lib/pio/lldp.rb
43
51
  - lib/pio/lldp/chassis-id-tlv.rb
44
52
  - lib/pio/lldp/end-of-lldpdu-value.rb
45
53
  - lib/pio/lldp/frame.rb
46
- - lib/pio/lldp/mac-address.rb
47
54
  - lib/pio/lldp/management-address-value.rb
48
55
  - lib/pio/lldp/optional-tlv.rb
56
+ - lib/pio/lldp/organizationally-specific-value.rb
49
57
  - lib/pio/lldp/port-description-value.rb
50
58
  - lib/pio/lldp/port-id-tlv.rb
51
59
  - lib/pio/lldp/system-capabilities-value.rb
52
60
  - lib/pio/lldp/system-description-value.rb
53
61
  - lib/pio/lldp/system-name-value.rb
54
62
  - lib/pio/lldp/ttl-tlv.rb
63
+ - lib/pio/mac.rb
64
+ - lib/pio/type/ethernet-header.rb
65
+ - lib/pio/type/ip-address.rb
66
+ - lib/pio/type/mac-address.rb
55
67
  - lib/pio/version.rb
56
68
  - pio.gemspec
57
- - spec/pio/lldp/chassis-id-tlv_spec.rb
58
- - spec/pio/lldp/end-of-lldpdu-value_spec.rb
59
- - spec/pio/lldp/frame_spec.rb
60
- - spec/pio/lldp/mac-address_spec.rb
61
- - spec/pio/lldp/optional-tlv_spec.rb
62
- - spec/pio/lldp/port-id-tlv_spec.rb
63
- - spec/pio/lldp/ttl-tlv_spec.rb
69
+ - pio.org
70
+ - pio.org_archive
71
+ - spec/pio/arp/reply_spec.rb
72
+ - spec/pio/arp/request_spec.rb
73
+ - spec/pio/arp_spec.rb
74
+ - spec/pio/ip_spec.rb
64
75
  - spec/pio/lldp_spec.rb
76
+ - spec/pio/mac_spec.rb
65
77
  - spec/spec_helper.rb
66
78
  homepage: http://github.com/trema/pio
67
79
  licenses:
@@ -88,13 +100,11 @@ signing_key:
88
100
  specification_version: 4
89
101
  summary: Packet parser and generator.
90
102
  test_files:
91
- - spec/pio/lldp/chassis-id-tlv_spec.rb
92
- - spec/pio/lldp/end-of-lldpdu-value_spec.rb
93
- - spec/pio/lldp/frame_spec.rb
94
- - spec/pio/lldp/mac-address_spec.rb
95
- - spec/pio/lldp/optional-tlv_spec.rb
96
- - spec/pio/lldp/port-id-tlv_spec.rb
97
- - spec/pio/lldp/ttl-tlv_spec.rb
103
+ - spec/pio/arp/reply_spec.rb
104
+ - spec/pio/arp/request_spec.rb
105
+ - spec/pio/arp_spec.rb
106
+ - spec/pio/ip_spec.rb
98
107
  - spec/pio/lldp_spec.rb
108
+ - spec/pio/mac_spec.rb
99
109
  - spec/spec_helper.rb
100
110
  has_rdoc:
@@ -1,27 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/chassis-id-tlv"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe ChassisIdTlv do
8
- subject { ChassisIdTlv.read( data.pack( "C*" ) ) }
9
-
10
- context "parsing a raw data" do
11
- let( :data ) { [ 0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d ] }
12
-
13
- its( :tlv_type ) { should eq 1 }
14
- its( :tlv_info_length ) { should eq 7 }
15
- its( :subtype ) { should eq 4 }
16
- its( :chassis_id ) { should eq data[ -6..-1 ].pack( "C*" ) }
17
- end
18
- end
19
- end
20
- end
21
-
22
-
23
- ### Local variables:
24
- ### mode: Ruby
25
- ### coding: utf-8-unix
26
- ### indent-tabs-mode: nil
27
- ### End:
@@ -1,20 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/end-of-lldpdu-value"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe EndOfLldpduValue do
8
- subject { EndOfLldpduValue.new }
9
-
10
- its( :tlv_info_string ) { should be_empty }
11
- end
12
- end
13
- end
14
-
15
-
16
- ### Local variables:
17
- ### mode: Ruby
18
- ### coding: utf-8-unix
19
- ### indent-tabs-mode: nil
20
- ### End:
@@ -1,82 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/frame"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe Frame do
8
- it "should parse a minimal LLDP" do
9
- sample_packet = [
10
- 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, # Destination MAC
11
- 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Source MAC
12
- 0x88, 0xcc, # Ethertype
13
- 0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Chassis ID TLV
14
- 0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x31, # Port ID TLV
15
- 0x06, 0x02, 0x00, 0x78, # Time to live TLV
16
- 0x00, 0x00, # End of LLDPDU TLV
17
- ].pack( "C*" )
18
-
19
- lldp = Frame.read( sample_packet )
20
- end
21
-
22
-
23
- it "should parse LLDP" do
24
- sample_packet = [
25
- 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, # Destination MAC
26
- 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Source MAC
27
- 0x88, 0xcc, # Ethertype
28
- 0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Chassis ID TLV
29
- 0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x31, # Port ID TLV
30
- 0x06, 0x02, 0x00, 0x78, # Time to live TLV
31
- 0x08, 0x17, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x2d, 0x50, 0x6f, 0x72, 0x74, 0x20, 0x31, 0x30, 0x30, 0x31, 0x00, # Port Description
32
- 0x0a, 0x0d, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x00, # System Name
33
- 0x0c, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x20, 0x2d, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x37, 0x2e, 0x34, 0x65, 0x2e, 0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x35, 0x29, 0x20, 0x62, 0x79, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x30, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x30, 0x35, 0x20, 0x30, 0x34, 0x3a, 0x35, 0x33, 0x3a, 0x31, 0x31, 0x00, # System Description
34
- 0x0e, 0x04, 0x00, 0x14, 0x00, 0x14, # System Capabilities
35
- 0x10, 0x0e, 0x07, 0x06, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0, 0x02, 0x00, 0x00, 0x03, 0xe9, 0x00, # Management Address
36
- 0xfe, 0x07, 0x00, 0x12, 0x0f, 0x02, 0x07, 0x01, 0x00,
37
- 0x00, 0x00, # End of LLDPDU TLV
38
- ].pack( "C*" )
39
-
40
- lldp = Frame.read( sample_packet )
41
- lldp.optional_tlv[ 0 ][ :tlv_type ].should eq 4
42
- lldp.optional_tlv[ 1 ][ :tlv_type ].should eq 5
43
- lldp.optional_tlv[ 2 ][ :tlv_type ].should eq 6
44
- lldp.optional_tlv[ 3 ][ :tlv_type ].should eq 7
45
- lldp.optional_tlv[ 4 ][ :tlv_type ].should eq 8
46
- lldp.optional_tlv[ 5 ][ :tlv_type ].should eq 0
47
- end
48
-
49
-
50
- it "should create a valid LLDP packet" do
51
- # sample packet taken from http://www.cloudshark.org/captures/05a981251df9
52
- sample_packet = [
53
- 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, # Destination MAC
54
- 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Source MAC
55
- 0x88, 0xcc, # Ethertype
56
- 0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d, # Chassis ID TLV
57
- 0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x31, # Port ID TLV
58
- 0x06, 0x02, 0x00, 0x78, # Time to live TLV
59
- 0x00, 0x00 # End of LLDPDU TLV
60
- ].pack( "C*" )
61
-
62
- lldp_frame = Frame.new
63
- lldp_frame.destination_mac = "01:80:c2:00:00:0e"
64
- lldp_frame.source_mac = "00:19:2f:a7:b2:8d"
65
- lldp_frame.chassis_id.subtype = 4
66
- lldp_frame.chassis_id = "\x00\x19\x2f\xa7\xb2\x8d"
67
- lldp_frame.port_id.subtype = 1
68
- lldp_frame.port_id = "Uplink to S1"
69
- lldp_frame.ttl = 120
70
-
71
- ( lldp_frame.to_binary_s.unpack( "H*" )[ 0 ] + "0000" ).should == sample_packet.unpack( "H*" )[ 0 ]
72
- end
73
- end
74
- end
75
- end
76
-
77
-
78
- ### Local variables:
79
- ### mode: Ruby
80
- ### coding: utf-8-unix
81
- ### indent-tabs-mode: nil
82
- ### End:
@@ -1,20 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/mac-address"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe MacAddress do
8
- subject { MacAddress.new( "01:80:c2:00:00:0e" ) }
9
-
10
- its( :to_binary_s ) { should eq [ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e ].pack( "C6" ) }
11
- end
12
- end
13
- end
14
-
15
-
16
- ### Local variables:
17
- ### mode: Ruby
18
- ### coding: utf-8-unix
19
- ### indent-tabs-mode: nil
20
- ### End:
@@ -1,81 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/optional-tlv"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe OptionalTlv do
8
- subject { OptionalTlv.read( data ) }
9
-
10
-
11
- context "when parsing End Of LLDPDU TLV" do
12
- let( :data ) { [ 0x00, 0x00 ].pack( "C*" ) }
13
-
14
- its( :tlv_type ) { should eq 0 }
15
- its( :tlv_info_length ) { should eq 0 }
16
- its( :tlv_value ) { should eq "tlv_info_string" => "" }
17
- end
18
-
19
-
20
- context "when parsing Port Description TLV" do
21
- let( :data ) { [ 0x08, 0x17, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x2d, 0x50, 0x6f, 0x72, 0x74, 0x20, 0x31, 0x30, 0x30, 0x31, 0x00 ].pack( "C*" ) }
22
-
23
- its( :tlv_type ) { should eq 4 }
24
- its( :tlv_info_length ) { should eq 23 }
25
- its( :tlv_value ) { should eq( { "port_description" => "Summit300-48-Port 1001" } ) }
26
- end
27
-
28
-
29
- context "when parsing System Name TLV" do
30
- let( :data ) { [ 0x0a, 0x0d, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x00 ].pack( "C*" ) }
31
-
32
- its( :tlv_type ) { should eq 5 }
33
- its( :tlv_info_length ) { should eq 13 }
34
- its( :tlv_value ) { should eq( { "system_name" => "Summit300-48" } ) }
35
- end
36
-
37
-
38
- context "when parsing System Description TLV" do
39
- let( :data ) { [ 0x0c, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x20, 0x2d, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x37, 0x2e, 0x34, 0x65, 0x2e, 0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x35, 0x29, 0x20, 0x62, 0x79, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x30, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x30, 0x35, 0x20, 0x30, 0x34, 0x3a, 0x35, 0x33, 0x3a, 0x31, 0x31, 0x00 ].pack( "C*" ) }
40
-
41
- its( :tlv_type ) { should eq 6 }
42
- its( :tlv_info_length ) { should eq 76 }
43
- its( :tlv_value ) { should eq( { "system_description"=>"Summit300-48 - Version 7.4e.1 (Build 5) by Release_Master 05/27/05 04:53:11" } ) }
44
- end
45
-
46
-
47
- context "when parsing System Capabilities TLV" do
48
- let( :data ) { [ 0x0e, 0x04, 0x00, 0x14, 0x00, 0x14 ].pack( "C*" ) }
49
-
50
- its( :tlv_type ) { should eq 7 }
51
- its( :tlv_info_length ) { should eq 4 }
52
- its( :tlv_value ) { should eq( { "system_capabilities" => 20, "enabled_capabilities" => 20 } ) }
53
- end
54
-
55
-
56
- context "when parsing Management Address TLV" do
57
- let( :data ) { [ 0x10, 0x0e, 0x07, 0x06, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0, 0x02, 0x00, 0x00, 0x03, 0xe9, 0x00 ].pack( "C*" ) }
58
-
59
- its( :tlv_type ) { should eq 8 }
60
- its( :tlv_info_length ) { should eq 14 }
61
- its( :tlv_value ) { should eq( { "management_address" => "\a\006" } ) } # FIXME
62
- end
63
-
64
-
65
- context "when parsing Organizationally Specific TLV" do
66
- let( :data ) { [ 0xfe, 0x07, 0x00, 0x12, 0x0f, 0x02, 0x07, 0x01, 0x00 ].pack( "C*" ) }
67
-
68
- its( :tlv_type ) { should eq 127 }
69
- its( :tlv_info_length ) { should eq 7 }
70
- its( :tlv_value ) { should eq "" } # FIXME
71
- end
72
- end
73
- end
74
- end
75
-
76
-
77
- ### Local variables:
78
- ### mode: Ruby
79
- ### coding: utf-8-unix
80
- ### indent-tabs-mode: nil
81
- ### End:
@@ -1,27 +0,0 @@
1
- require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
2
- require "pio/lldp/port-id-tlv"
3
-
4
-
5
- module Pio
6
- class Lldp
7
- describe PortIdTlv do
8
- subject { PortIdTlv.read( data.pack( "C*" ) ) }
9
-
10
- context "parsing a raw data" do
11
- let( :data ) { [ 0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x31 ] }
12
-
13
- its( :tlv_type ) { should eq 2 }
14
- its( :tlv_info_length ) { should eq 13 }
15
- its( :subtype ) { should eq 1 }
16
- its( :port_id ) { should eq data[ -12..-1 ].pack( "C*" ) }
17
- end
18
- end
19
- end
20
- end
21
-
22
-
23
- ### Local variables:
24
- ### mode: Ruby
25
- ### coding: utf-8-unix
26
- ### indent-tabs-mode: nil
27
- ### End: