pio 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 46ff2e5ea71119c5c3f334e9714aad64c6394416
4
- data.tar.gz: f8d3b344b34473f4ff12992e86ee02db5e97f750
3
+ metadata.gz: 7440562aee407d80e2f3f795a40fb065b6a6189a
4
+ data.tar.gz: f28861cef1a8a0a3e2807b77a62ddd5bbc98ac47
5
5
  SHA512:
6
- metadata.gz: d12b409112666b903cd16280299613440986d86d199e6cf1eff4d1631ba6580c792bc539fac1f4c19017014a6999b2bdb05e4a501b9b4a10ec9332d0f4759afd
7
- data.tar.gz: c44a02181e9b75710884acf48773d1f0a287c07d13e96c9f86a25552a4e22682eced7409f32f061836dc7f0a838e4dffa9e42bf41f0a10e0dfc38d706426418e
6
+ metadata.gz: dc1f92d485a60ec4e53bb6e260962ed56186d89ddf4e79c4e4abcb4c2a3dd7140101e41a765c93502936d170082bd83fc669c165efcc49c3a0a14c44331dc7d1
7
+ data.tar.gz: 5af6281ba069a05d1ebd7f7608d5e2a01f2c80c60f5c0d6de22ab0463ae8c377841e11ae41c9faca5c078b5dcfb2e9546ebddbd6aa5361a223d9ded017993b58
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ ## 0.5.0 (4/14/2014)
4
+
5
+ * Added new class `Pio::Hello`.
6
+
7
+ ### Misc
8
+
9
+ * Added new rake task `cucumber`.
10
+ * Added new rake task `dump_pcap`.
11
+
12
+
13
+ ## 0.4.0 (3/31/2014)
14
+
15
+ ### New features
16
+ * Added new classes `Pio::Dhcp`, `Pio::Dhcp::Discover`,
17
+ `Pio::Dhcp::Offer`, `Pio::Dhcp::Request` and `Pio::Dhcp::Ack`.
18
+
19
+ ### Changes
20
+ * Added new class alias `Pio::ICMP` => `Pio::Icmp`.
21
+ * Added new class alias `Pio::ARP` => `Pio::Arp`.
22
+ * Added new class alias `Pio::LLDP` => `Pio::Lldp`.
23
+ * Added new class alias `Pio::DHCP` => `Pio::Dhcp`.
data/README.md CHANGED
@@ -16,6 +16,8 @@ supports the following packet formats:
16
16
  - ARP
17
17
  - LLDP
18
18
  - DHCP
19
+ - OpenFlow 1.0 messages
20
+ - Hello
19
21
  - (…currently there are just a few formats supported but I'm sure this list will grow)
20
22
 
21
23
  ## Features Overview
@@ -158,6 +160,24 @@ Also you can use `Pio::Dhcp::Discover#new`,
158
160
  )
159
161
  ack.to_binary # => DHCP Ack frame in binary format
160
162
 
163
+ ### Hello
164
+
165
+ To parse an OpenFlow 1.0 Hello message, use the API `Pio::Hello.read`
166
+ and you can access each field of the parsed Hello message.
167
+
168
+ require 'pio'
169
+
170
+ hello = Pio::Hello.read(binary_data)
171
+ hello.transaction_id # => 123
172
+
173
+ Also you can use `Pio::Hello#new` to generate a Hello message like
174
+ below:
175
+
176
+ require 'pio'
177
+
178
+ hello = Pio::Hello.new(transaction_id: 123)
179
+ hello.to_binary # => HELLO message in binary format.
180
+
161
181
  ## Installation
162
182
 
163
183
  The simplest way to install Pio is to use [Bundler](http://gembundler.com/).
data/Rakefile CHANGED
@@ -5,8 +5,8 @@ require 'bundler/gem_tasks'
5
5
  # rubocop:disable HashSyntax
6
6
 
7
7
  task :default => :travis
8
-
9
- task :travis => [:spec, :quality, 'coveralls:push']
8
+ task :test => [:spec, :cucumber]
9
+ task :travis => [:test, :quality, 'coveralls:push']
10
10
 
11
11
  desc 'Check for code quality'
12
12
  task :quality => [:reek, :flog, :flay, :rubocop]
@@ -0,0 +1,4 @@
1
+ require 'pio'
2
+
3
+ hello = Pio::Hello.new(transaction_id: 123)
4
+ hello.to_binary # => HELLO message in binary format.
@@ -0,0 +1,4 @@
1
+ require 'pio'
2
+
3
+ hello = Pio::Hello.read(binary_data)
4
+ hello.transaction_id # => 123
@@ -0,0 +1,10 @@
1
+ Feature: Pio::Arp.read
2
+ Scenario: arp.pcap
3
+ Given a pcap file "arp.pcap"
4
+ When I try to parse the pcap file with "Arp" class
5
+ Then it should finish successfully
6
+
7
+ Scenario: arp-storm.pcap
8
+ Given a pcap file "arp-storm.pcap"
9
+ When I try to parse the pcap file with "Arp" class
10
+ Then it should finish successfully
@@ -0,0 +1,5 @@
1
+ Feature: Pio::Dhcp.read
2
+ Scenario: dhcp.pcap
3
+ Given a pcap file "dhcp.pcap"
4
+ When I try to parse the pcap file with "Dhcp" class
5
+ Then it should finish successfully
@@ -0,0 +1,5 @@
1
+ Feature: Pio::Icmp.read
2
+ Scenario: icmp.pcap
3
+ Given a pcap file "icmp.pcap"
4
+ When I try to parse the pcap file with "Icmp" class
5
+ Then it should finish successfully
@@ -0,0 +1,10 @@
1
+ Feature: Pio::Lldp.read
2
+ Scenario: lldp.minimal.pcap
3
+ Given a pcap file "lldp.minimal.pcap"
4
+ When I try to parse the pcap file with "Lldp" class
5
+ Then it should finish successfully
6
+
7
+ Scenario: lldp.detailed.pcap
8
+ Given a pcap file "lldp.detailed.pcap"
9
+ When I try to parse the pcap file with "Lldp" class
10
+ Then it should finish successfully
Binary file
Binary file
Binary file
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ Given(/^a pcap file "(.*?)"$/) do |pcap|
4
+ @pcap = File.join(File.dirname(__FILE__), '..', 'pcap', pcap)
5
+ end
6
+
7
+ When(/^I try to parse the pcap file with "(.*?)" class$/) do |parser|
8
+ File.open(@pcap) do |file|
9
+ pcap = Pio::Pcap::Frame.read(file)
10
+ pcap.records.each do |each|
11
+ Pio.const_get(parser).__send__ :read, each.data
12
+ end
13
+ end
14
+ end
15
+
16
+ Then(/^it should finish successfully$/) do
17
+ # Noop.
18
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pio'
4
+ require 'pio/pcap'
data/lib/pio.rb CHANGED
@@ -3,7 +3,8 @@
3
3
  require 'pio/parse_error'
4
4
 
5
5
  require 'pio/arp'
6
- require 'pio/lldp'
6
+ require 'pio/dhcp'
7
+ require 'pio/hello'
7
8
  require 'pio/icmp'
9
+ require 'pio/lldp'
8
10
  require 'pio/mac'
9
- require 'pio/dhcp'
@@ -1,8 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'pio/dhcp/type/dhcp_param_list'
4
- require 'pio/dhcp/type/dhcp_client_id'
5
- require 'pio/dhcp/type/dhcp_string'
3
+ require 'pio/dhcp/parameter_list'
4
+ require 'pio/dhcp/client_id'
6
5
  require 'pio/type/ip_address'
7
6
 
8
7
  module Pio
@@ -29,7 +28,7 @@ module Pio
29
28
  ip_address Dhcp::REQUESTED_IP_ADDRESS_TLV
30
29
  client_id Dhcp::CLIENT_IDENTIFIER_TLV
31
30
  parameter_list Dhcp::PARAMETERS_LIST_TLV
32
- dhcp_string DEFAULT
31
+ string DEFAULT
33
32
  end
34
33
 
35
34
  def end_of_dhcptlv?
@@ -3,7 +3,7 @@
3
3
  require 'bindata'
4
4
 
5
5
  module Pio
6
- module Type
6
+ class Dhcp
7
7
  # DHCP ParameterList Format.
8
8
  class ParameterList < BinData::Primitive
9
9
  array :octets,
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'forwardable'
4
+ require 'pio/hello/format'
5
+
6
+ module Pio
7
+ # OpenFlow 1.0 Hello message
8
+ class Hello
9
+ extend Forwardable
10
+
11
+ def_delegators :@data, :version
12
+ def_delegators :@data, :message_type
13
+ def_delegators :@data, :message_length
14
+ def_delegators :@data, :transaction_id
15
+ def_delegator :@data, :transaction_id, :xid
16
+ def_delegators :@data, :body
17
+ def_delegator :@data, :to_binary_s, :to_binary
18
+
19
+ def self.read(raw_data)
20
+ hello = allocate
21
+ hello.instance_variable_set :@data, Format.read(raw_data)
22
+ hello
23
+ end
24
+
25
+ def initialize(user_options = {})
26
+ @options = user_options.dup
27
+ handle_option_aliases
28
+ @data = Format.new(@options)
29
+ end
30
+
31
+ private
32
+
33
+ def handle_option_aliases
34
+ @options[:transaction_id] ||= @options[:xid]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bindata'
4
+
5
+ module Pio
6
+ class Hello
7
+ # OpenFlow 1.0 Hello message
8
+ class Format < BinData::Record
9
+ endian :big
10
+
11
+ uint8 :version, value: 1
12
+ uint8 :message_type
13
+ uint16 :message_length, initial_value: 8
14
+ uint32 :transaction_id
15
+ string :body # ignored
16
+ end
17
+ end
18
+ end
@@ -4,18 +4,13 @@ require 'forwardable'
4
4
  require 'ipaddr'
5
5
 
6
6
  module Pio
7
- #
8
7
  # IPv4 Address
9
- #
10
8
  class IPv4Address
11
9
  extend Forwardable
12
10
 
13
- #
14
11
  # @return [IPAddr] value object instance of proxied IPAddr.
15
- #
16
12
  attr_reader :value
17
13
 
18
- #
19
14
  # Creates a {IPv4Address} instance object as a proxy to IPAddr class.
20
15
  #
21
16
  # @overload initialize(addr)
@@ -27,7 +22,6 @@ module Pio
27
22
  #
28
23
  # @return [IPv4Address] self
29
24
  # a proxy to IPAddr.
30
- #
31
25
  def initialize(addr)
32
26
  case addr
33
27
  when Integer
@@ -41,26 +35,18 @@ module Pio
41
35
  end
42
36
  end
43
37
 
44
- #
45
38
  # @return [String] the IPv4 address in its text representation.
46
- #
47
39
  def_delegator :value, :to_s
48
40
 
49
- #
50
41
  # @return [Number] the IPv4 address in its numeric representation.
51
- #
52
42
  def_delegator :value, :to_i
53
43
 
54
- #
55
44
  # @return [Range] Creates a Range object for the network address.
56
- #
57
45
  def_delegator :value, :to_range
58
46
 
59
47
  def_delegator :value, :==
60
48
 
61
- #
62
49
  # @return [Number] prefix length of IPv4 address.
63
- #
64
50
  def prefixlen
65
51
  netmask = to_range.first.to_i ^ to_range.last.to_i
66
52
  if netmask > 0
@@ -70,88 +56,68 @@ module Pio
70
56
  end
71
57
  end
72
58
 
73
- #
74
59
  # @return [Array]
75
60
  # an array of decimal numbers converted from IPv4 address.
76
- #
77
61
  def to_a
78
62
  to_s.split('.').map do | each |
79
63
  each.to_i
80
64
  end
81
65
  end
82
66
 
83
- #
84
67
  # @return [Array]
85
68
  # an array of decimal numbers converted from IPv4 address.
86
- #
87
69
  def to_ary
88
70
  to_a
89
71
  end
90
72
 
91
- #
73
+ # Returns the IPv4 address masked with +masklen+.
92
74
  # @return [IPv4Address]
93
- # Returns the IPv4 address masked with masklen.
94
- #
95
75
  def mask!(masklen)
96
76
  @value = @value.mask(masklen)
97
77
  self
98
78
  end
99
79
  alias_method :prefix!, :mask!
100
80
 
101
- #
81
+ # Returns the IPv4 address masked with +masklen+.
102
82
  # @return [IPv4Address]
103
- # Returns the IPv4 address masked with masklen.
104
- #
105
83
  def mask(masklen)
106
84
  clone.mask!(masklen)
107
85
  end
108
86
  alias_method :prefix, :mask
109
87
 
110
- #
111
88
  # @return [bool]
112
89
  # Returns true if the address belongs to class A.
113
- #
114
90
  def class_a?
115
91
  mask(1).to_s == '0.0.0.0'
116
92
  end
117
93
 
118
- #
119
94
  # @return [bool]
120
95
  # Returns true if the address belongs to class B.
121
- #
122
96
  def class_b?
123
97
  mask(2).to_s == '128.0.0.0'
124
98
  end
125
99
 
126
- #
127
100
  # @return [bool]
128
101
  # Returns true if the address belongs to class C.
129
- #
130
102
  def class_c?
131
103
  mask(3).to_s == '192.0.0.0'
132
104
  end
133
105
 
134
- #
135
106
  # @return [bool]
136
107
  # Returns true if the address belongs to class D.
137
- #
138
108
  def class_d?
139
109
  mask(4).to_s == '224.0.0.0'
140
110
  end
141
111
  alias_method :multicast?, :class_d?
142
112
 
143
- #
144
113
  # @return [bool]
145
114
  # Returns true if the address belongs to class E.
146
- #
147
115
  def class_e?
148
116
  mask(4).to_s == '240.0.0.0'
149
117
  end
150
118
 
151
- #
152
119
  # @return [bool]
153
120
  # Returns true if the address is unicast address.
154
- #
155
121
  def unicast?
156
122
  class_a? || class_b? || class_c?
157
123
  end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bindata'
4
+
5
+ module Pio
6
+ # .pcap file parser
7
+ module Pcap
8
+ BIG_ENDIAN = 0xa1b2c3d4
9
+ LITTLE_ENDIAN = 0xd4c3b2a1
10
+
11
+ LINKTYPE_ETHERNET = 1
12
+
13
+ # Big or little endian?
14
+ # This code smells of :reek:UncommunicativeModuleName
15
+ class EndianMagicNumber16 < BinData::Choice
16
+ int16be BIG_ENDIAN, initial_value: :value
17
+ int16le LITTLE_ENDIAN, initial_value: :value
18
+ end
19
+
20
+ # Big or little endian?
21
+ # This code smells of :reek:UncommunicativeModuleName
22
+ class EndianMagicNumber32 < BinData::Choice
23
+ int32be BIG_ENDIAN, initial_value: :value
24
+ int32le LITTLE_ENDIAN, initial_value: :value
25
+ end
26
+
27
+ # .pcap format
28
+ class Frame < BinData::Record
29
+ byte_order = -> { file_header.magic }
30
+
31
+ struct :file_header do
32
+ hide :thiszone, :sigfigs
33
+
34
+ uint32be :magic,
35
+ initial_value: 0xa1b2c3d4,
36
+ assert: -> { value == BIG_ENDIAN || value == LITTLE_ENDIAN }
37
+ endian_magic_number16 :version_major, value: 2, selection: byte_order
38
+ endian_magic_number16 :version_minor, value: 4, selection: byte_order
39
+ endian_magic_number32 :thiszone, value: 0, selection: byte_order
40
+ endian_magic_number32 :sigfigs, value: 0, selection: byte_order
41
+ endian_magic_number32 :snaplen, value: 65_535, selection: byte_order
42
+ endian_magic_number32 :linktype,
43
+ value: LINKTYPE_ETHERNET,
44
+ selection: byte_order
45
+ end
46
+
47
+ array :records, read_until: :eof do
48
+ struct :pkthdr do
49
+ struct :ts do
50
+ endian_magic_number32 :sec, value: 0, selection: byte_order
51
+ endian_magic_number32 :usec, value: 0, selection: byte_order
52
+ end
53
+ endian_magic_number32 :caplen,
54
+ value: -> { data.length },
55
+ selection: byte_order
56
+ endian_magic_number32 :len,
57
+ value: -> { data.length },
58
+ selection: byte_order
59
+ end
60
+ string :data, read_length: -> { pkthdr.caplen }
61
+ end
62
+ end
63
+ end
64
+ end
@@ -3,5 +3,5 @@
3
3
  # Base module.
4
4
  module Pio
5
5
  # gem version.
6
- VERSION = '0.4.0'.freeze
6
+ VERSION = '0.5.0'.freeze
7
7
  end
@@ -24,8 +24,15 @@ Gem::Specification.new do |gem|
24
24
 
25
25
  gem.require_paths = ['lib']
26
26
 
27
- gem.extra_rdoc_files = ['README.md']
27
+ gem.extra_rdoc_files =
28
+ [
29
+ 'README.md',
30
+ 'CHANGELOG.md',
31
+ 'LICENSE',
32
+ 'CONTRIBUTING.md'
33
+ ]
28
34
  gem.test_files = Dir.glob('spec/**/*')
35
+ gem.test_files += Dir.glob('features/**/*')
29
36
 
30
37
  gem.required_ruby_version = '>= 1.9.3'
31
38
  gem.add_dependency 'bindata', '~> 2.0.0'
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pio'
4
+
5
+ describe Pio::Hello do
6
+ describe '.read' do
7
+ context 'with an hello message' do
8
+ Given(:hello_dump) { [1, 0, 0, 8, 0, 0, 0, 0].pack('C*') }
9
+
10
+ When(:hello) { Pio::Hello.read(hello_dump) }
11
+
12
+ Then { hello.class == Pio::Hello }
13
+ Then { hello.version == 1 }
14
+ Then { hello.message_type == 0 }
15
+ Then { hello.message_length == 8 }
16
+ Then { hello.xid == 0 }
17
+ Then { hello.body.empty? }
18
+ end
19
+ end
20
+
21
+ describe '.new' do
22
+ context 'with no arguments' do
23
+ When(:hello) { Pio::Hello.new }
24
+
25
+ Then { hello.class == Pio::Hello }
26
+ Then { hello.version == 1 }
27
+ Then { hello.message_type == 0 }
28
+ Then { hello.message_length == 8 }
29
+ Then { hello.xid == 0 }
30
+ Then { hello.body.empty? }
31
+ Then { hello.to_binary == [1, 0, 0, 8, 0, 0, 0, 0].pack('C*') }
32
+ end
33
+
34
+ context 'with transaction_id: 123' do
35
+ When(:hello) { Pio::Hello.new(transaction_id: 123) }
36
+
37
+ Then { hello.class == Pio::Hello }
38
+ Then { hello.version == 1 }
39
+ Then { hello.message_type == 0 }
40
+ Then { hello.message_length == 8 }
41
+ Then { hello.xid == 123 }
42
+ Then { hello.body.empty? }
43
+ Then { hello.to_binary == [1, 0, 0, 8, 0, 0, 0, 123].pack('C*') }
44
+ end
45
+
46
+ context 'with xid: 123' do
47
+ When(:hello) { Pio::Hello.new(xid: 123) }
48
+
49
+ Then { hello.class == Pio::Hello }
50
+ Then { hello.version == 1 }
51
+ Then { hello.message_type == 0 }
52
+ Then { hello.message_length == 8 }
53
+ Then { hello.xid == 123 }
54
+ Then { hello.body.empty? }
55
+ Then { hello.to_binary == [1, 0, 0, 8, 0, 0, 0, 123].pack('C*') }
56
+ end
57
+ end
58
+ end
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.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhito Takamiya
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-31 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -45,7 +45,11 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files:
47
47
  - README.md
48
+ - CHANGELOG.md
49
+ - LICENSE
50
+ - CONTRIBUTING.md
48
51
  files:
52
+ - CHANGELOG.md
49
53
  - CONTRIBUTING.md
50
54
  - LICENSE
51
55
  - README.md
@@ -54,10 +58,24 @@ files:
54
58
  - examples/arp_read.rb
55
59
  - examples/dhcp_new.rb
56
60
  - examples/dhcp_read.rb
61
+ - examples/hello_new.rb
62
+ - examples/hello_read.rb
57
63
  - examples/icmp_new.rb
58
64
  - examples/icmp_read.rb
59
65
  - examples/lldp_new.rb
60
66
  - examples/lldp_read.rb
67
+ - features/arp_read.feature
68
+ - features/dhcp_read.feature
69
+ - features/icmp_read.feature
70
+ - features/lldp_read.feature
71
+ - features/pcap/arp-storm.pcap
72
+ - features/pcap/arp.pcap
73
+ - features/pcap/dhcp.pcap
74
+ - features/pcap/icmp.pcap
75
+ - features/pcap/lldp.detailed.pcap
76
+ - features/pcap/lldp.minimal.pcap
77
+ - features/step_definitions/pcap_steps.rb
78
+ - features/support/env.rb
61
79
  - lib/pio.rb
62
80
  - lib/pio/arp.rb
63
81
  - lib/pio/arp/frame.rb
@@ -70,6 +88,7 @@ files:
70
88
  - lib/pio/dhcp/boot_reply_options.rb
71
89
  - lib/pio/dhcp/boot_request.rb
72
90
  - lib/pio/dhcp/boot_request_options.rb
91
+ - lib/pio/dhcp/client_id.rb
73
92
  - lib/pio/dhcp/common_options.rb
74
93
  - lib/pio/dhcp/csum_util.rb
75
94
  - lib/pio/dhcp/dhcp_field.rb
@@ -80,10 +99,10 @@ files:
80
99
  - lib/pio/dhcp/message.rb
81
100
  - lib/pio/dhcp/offer.rb
82
101
  - lib/pio/dhcp/optional_tlv.rb
102
+ - lib/pio/dhcp/parameter_list.rb
83
103
  - lib/pio/dhcp/request.rb
84
- - lib/pio/dhcp/type/dhcp_client_id.rb
85
- - lib/pio/dhcp/type/dhcp_param_list.rb
86
- - lib/pio/dhcp/type/dhcp_string.rb
104
+ - lib/pio/hello.rb
105
+ - lib/pio/hello/format.rb
87
106
  - lib/pio/icmp.rb
88
107
  - lib/pio/icmp/frame.rb
89
108
  - lib/pio/icmp/message.rb
@@ -109,6 +128,7 @@ files:
109
128
  - lib/pio/message_type_selector.rb
110
129
  - lib/pio/options.rb
111
130
  - lib/pio/parse_error.rb
131
+ - lib/pio/pcap.rb
112
132
  - lib/pio/type/ethernet_header.rb
113
133
  - lib/pio/type/ip_address.rb
114
134
  - lib/pio/type/ipv4_header.rb
@@ -126,6 +146,7 @@ files:
126
146
  - spec/pio/dhcp/offer_spec.rb
127
147
  - spec/pio/dhcp/request_spec.rb
128
148
  - spec/pio/dhcp_spec.rb
149
+ - spec/pio/hello_spec.rb
129
150
  - spec/pio/icmp/reply_spec.rb
130
151
  - spec/pio/icmp/request_spec.rb
131
152
  - spec/pio/icmp_spec.rb
@@ -159,22 +180,35 @@ signing_key:
159
180
  specification_version: 4
160
181
  summary: Packet parser and generator.
161
182
  test_files:
162
- - spec/pio/arp/reply/options_spec.rb
163
- - spec/pio/arp/reply_spec.rb
164
- - spec/pio/arp/request/options_spec.rb
165
- - spec/pio/arp/request_spec.rb
166
- - spec/pio/arp_spec.rb
183
+ - spec/pio/ipv4_address_spec.rb
184
+ - spec/pio/hello_spec.rb
185
+ - spec/pio/dhcp/request_spec.rb
186
+ - spec/pio/dhcp/offer_spec.rb
167
187
  - spec/pio/dhcp/ack_spec.rb
168
188
  - spec/pio/dhcp/discover_spec.rb
169
- - spec/pio/dhcp/offer_spec.rb
170
- - spec/pio/dhcp/request_spec.rb
171
- - spec/pio/dhcp_spec.rb
172
- - spec/pio/icmp/reply_spec.rb
189
+ - spec/pio/arp/request_spec.rb
190
+ - spec/pio/arp/reply/options_spec.rb
191
+ - spec/pio/arp/request/options_spec.rb
192
+ - spec/pio/arp/reply_spec.rb
193
+ - spec/pio/lldp/options_spec.rb
194
+ - spec/pio/mac_spec.rb
173
195
  - spec/pio/icmp/request_spec.rb
196
+ - spec/pio/icmp/reply_spec.rb
174
197
  - spec/pio/icmp_spec.rb
175
- - spec/pio/ipv4_address_spec.rb
176
- - spec/pio/lldp/options_spec.rb
198
+ - spec/pio/dhcp_spec.rb
177
199
  - spec/pio/lldp_spec.rb
178
- - spec/pio/mac_spec.rb
200
+ - spec/pio/arp_spec.rb
179
201
  - spec/spec_helper.rb
202
+ - features/pcap/dhcp.pcap
203
+ - features/pcap/arp.pcap
204
+ - features/pcap/lldp.minimal.pcap
205
+ - features/pcap/icmp.pcap
206
+ - features/pcap/arp-storm.pcap
207
+ - features/pcap/lldp.detailed.pcap
208
+ - features/support/env.rb
209
+ - features/icmp_read.feature
210
+ - features/arp_read.feature
211
+ - features/step_definitions/pcap_steps.rb
212
+ - features/lldp_read.feature
213
+ - features/dhcp_read.feature
180
214
  has_rdoc:
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'bindata'
4
-
5
- module Pio
6
- module Type
7
- # DHCP String Format.
8
- class DhcpString < BinData::Primitive
9
- string :dhcp_string,
10
- read_length: :tlv_info_length
11
-
12
- def set(value)
13
- self.dhcp_string = value
14
- end
15
-
16
- def get
17
- dhcp_string
18
- end
19
- end
20
- end
21
- end