pio 0.27.1 → 0.27.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Rakefile +1 -1
  4. data/bin/{terminal-notifier → code_metrics} +2 -2
  5. data/bin/code_metrics-profile +16 -0
  6. data/features/icmpv6.pcap +0 -0
  7. data/features/open_flow10/aggregate_stats_reply.feature +1 -1
  8. data/features/open_flow10/aggregate_stats_request.feature +2 -2
  9. data/features/open_flow10/bad_request.feature +2 -2
  10. data/features/open_flow10/barrier_reply.feature +3 -18
  11. data/features/open_flow10/barrier_request.feature +3 -18
  12. data/features/open_flow10/description_stats_reply.feature +1 -1
  13. data/features/open_flow10/description_stats_request.feature +3 -3
  14. data/features/open_flow10/echo_reply.feature +4 -47
  15. data/features/open_flow10/echo_request.feature +4 -36
  16. data/features/open_flow10/exact_match.feature +20 -2
  17. data/features/open_flow10/features_reply.feature +65 -72
  18. data/features/open_flow10/features_request.feature +3 -22
  19. data/features/open_flow10/flow_mod.feature +5 -5
  20. data/features/open_flow10/flow_stats_reply.feature +2 -2
  21. data/features/open_flow10/flow_stats_request.feature +3 -4
  22. data/features/open_flow10/hello.feature +4 -20
  23. data/features/open_flow10/hello_failed.feature +4 -4
  24. data/features/open_flow10/packet_in.feature +2 -2
  25. data/features/open_flow10/packet_in_arp_reply.raw +0 -0
  26. data/features/open_flow10/packet_out.feature +1 -1
  27. data/features/open_flow10/port_status.feature +1 -1
  28. data/features/open_flow13/bad_request.feature +2 -2
  29. data/features/open_flow13/echo_reply.feature +5 -37
  30. data/features/open_flow13/echo_request.feature +5 -37
  31. data/features/open_flow13/features_reply.feature +3 -7
  32. data/features/open_flow13/features_request.feature +3 -18
  33. data/features/open_flow13/flow_mod.feature +5 -5
  34. data/features/open_flow13/hello.feature +4 -19
  35. data/features/open_flow13/hello_failed.feature +4 -4
  36. data/features/open_flow13/match.feature +4 -4
  37. data/features/open_flow13/packet_in.feature +3 -3
  38. data/features/open_flow13/packet_out.feature +3 -3
  39. data/features/parser.feature +10 -0
  40. data/lib/pio/arp/format.rb +20 -0
  41. data/lib/pio/ipv4_header.rb +20 -0
  42. data/lib/pio/open_flow.rb +0 -1
  43. data/lib/pio/open_flow/message.rb +51 -57
  44. data/lib/pio/open_flow/open_flow_header.rb +6 -10
  45. data/lib/pio/open_flow10.rb +20 -15
  46. data/lib/pio/open_flow10/aggregate_stats/reply.rb +20 -0
  47. data/lib/pio/open_flow10/aggregate_stats/request.rb +25 -0
  48. data/lib/pio/open_flow10/barrier/reply.rb +14 -0
  49. data/lib/pio/open_flow10/barrier/request.rb +14 -0
  50. data/lib/pio/open_flow10/description_stats/reply.rb +21 -0
  51. data/lib/pio/open_flow10/description_stats/request.rb +19 -0
  52. data/lib/pio/open_flow10/echo/reply.rb +16 -0
  53. data/lib/pio/open_flow10/echo/request.rb +16 -0
  54. data/lib/pio/open_flow10/error/bad_request.rb +27 -49
  55. data/lib/pio/open_flow10/error/hello_failed.rb +6 -28
  56. data/lib/pio/open_flow10/exact_match.rb +4 -39
  57. data/lib/pio/open_flow10/features/reply.rb +48 -72
  58. data/lib/pio/open_flow10/features/request.rb +4 -11
  59. data/lib/pio/open_flow10/flow_mod.rb +21 -51
  60. data/lib/pio/open_flow10/{flow_stats_reply.rb → flow_stats/reply.rb} +7 -23
  61. data/lib/pio/open_flow10/flow_stats/request.rb +25 -0
  62. data/lib/pio/open_flow10/hello.rb +3 -13
  63. data/lib/pio/open_flow10/match.rb +0 -18
  64. data/lib/pio/open_flow10/match10.rb +22 -0
  65. data/lib/pio/open_flow10/packet_in.rb +18 -42
  66. data/lib/pio/open_flow10/packet_out.rb +8 -31
  67. data/lib/pio/open_flow10/port_status.rb +11 -39
  68. data/lib/pio/open_flow10/stats_reply.rb +11 -8
  69. data/lib/pio/open_flow10/stats_request.rb +8 -8
  70. data/lib/pio/open_flow13.rb +13 -6
  71. data/lib/pio/open_flow13/echo/reply.rb +15 -0
  72. data/lib/pio/open_flow13/echo/request.rb +15 -0
  73. data/lib/pio/open_flow13/error/bad_request.rb +32 -49
  74. data/lib/pio/open_flow13/error/hello_failed.rb +7 -30
  75. data/lib/pio/open_flow13/features/reply.rb +27 -51
  76. data/lib/pio/open_flow13/features/request.rb +3 -10
  77. data/lib/pio/open_flow13/flow_mod.rb +29 -52
  78. data/lib/pio/open_flow13/hello.rb +18 -22
  79. data/lib/pio/open_flow13/packet_in.rb +26 -44
  80. data/lib/pio/open_flow13/packet_out.rb +16 -35
  81. data/lib/pio/open_flow13/stats_request.rb +5 -21
  82. data/lib/pio/parser.rb +5 -4
  83. data/lib/pio/version.rb +1 -1
  84. data/pio.gemspec +6 -6
  85. data/spec/pio/open_flow10/{echo_reply_spec.rb → echo/reply_spec.rb} +1 -1
  86. data/spec/pio/open_flow10/{echo_request_spec.rb → echo/request_spec.rb} +1 -1
  87. data/spec/pio/open_flow10/error/hello_failed_spec.rb +2 -2
  88. data/spec/pio/open_flow10/features/request_spec.rb +0 -5
  89. data/spec/pio/open_flow10/flow_mod_spec.rb +2 -4
  90. data/spec/pio/open_flow10/flow_stats_reply_spec.rb +1 -1
  91. data/spec/pio/open_flow10/flow_stats_request_spec.rb +2 -2
  92. data/spec/pio/open_flow10/packet_out_spec.rb +15 -18
  93. data/spec/pio/open_flow13/echo_reply_spec.rb +1 -1
  94. data/spec/pio/open_flow13/echo_request_spec.rb +1 -1
  95. data/spec/pio/open_flow13/error/hello_failed_spec.rb +2 -2
  96. data/spec/pio/open_flow13/features/request_spec.rb +5 -3
  97. data/spec/pio/open_flow13/hello_spec.rb +3 -3
  98. data/spec/support/shared_examples_for_openflow_messages.rb +5 -12
  99. metadata +92 -85
  100. data/lib/pio/open_flow/echo.rb +0 -44
  101. data/lib/pio/open_flow/format.rb +0 -46
  102. data/lib/pio/open_flow10/aggregate_stats_reply.rb +0 -38
  103. data/lib/pio/open_flow10/aggregate_stats_request.rb +0 -42
  104. data/lib/pio/open_flow10/barrier_reply.rb +0 -21
  105. data/lib/pio/open_flow10/barrier_request.rb +0 -22
  106. data/lib/pio/open_flow10/description_stats_reply.rb +0 -35
  107. data/lib/pio/open_flow10/description_stats_request.rb +0 -36
  108. data/lib/pio/open_flow10/echo.rb +0 -20
  109. data/lib/pio/open_flow10/flow_stats_request.rb +0 -64
  110. data/lib/pio/open_flow13/echo.rb +0 -20
  111. data/lib/pio/open_flow13/features.rb +0 -2
@@ -8,28 +8,24 @@ module Pio
8
8
 
9
9
  uint8 :ofp_version
10
10
  uint8 :message_type
11
- uint16 :_length
11
+ uint16 :message_length
12
12
  transaction_id :transaction_id
13
13
  rest :body
14
-
15
- def length
16
- _length
17
- end
18
14
  end
19
15
 
20
16
  # OpenFlow message header.
21
- class OpenFlowHeader < BinData::Record
17
+ class OfpHeader < BinData::Record
22
18
  endian :big
23
19
 
24
- uint8 :ofp_version, value: :ofp_version_value
25
- virtual assert: -> { ofp_version == ofp_version_value }
20
+ uint8 :ofp_version, value: :version_value
21
+ virtual assert: -> { ofp_version == version_value }
26
22
  uint8 :message_type, value: :message_type_value
27
23
  virtual assert: -> { message_type == message_type_value }
28
- uint16 :_length, initial_value: -> { 8 + body.length }
24
+ uint16 :message_length, initial_value: -> { length + body_length }
29
25
  transaction_id :transaction_id, initial_value: 0
30
26
 
31
27
  def length
32
- _length
28
+ 8
33
29
  end
34
30
  end
35
31
  end
@@ -1,24 +1,29 @@
1
- require 'pio/open_flow10/aggregate_stats_reply.rb'
2
- require 'pio/open_flow10/aggregate_stats_request.rb'
3
- require 'pio/open_flow10/barrier_reply'
4
- require 'pio/open_flow10/barrier_request'
5
- require 'pio/open_flow10/description_stats_reply'
6
- require 'pio/open_flow10/description_stats_request'
7
- require 'pio/open_flow10/echo'
1
+ # Messages
2
+ require 'pio/open_flow10/stats_reply'
3
+ require 'pio/open_flow10/aggregate_stats/reply'
4
+ require 'pio/open_flow10/aggregate_stats/request'
5
+ require 'pio/open_flow10/barrier/reply'
6
+ require 'pio/open_flow10/barrier/request'
7
+ require 'pio/open_flow10/description_stats/reply'
8
+ require 'pio/open_flow10/description_stats/request'
9
+ require 'pio/open_flow10/echo/reply'
10
+ require 'pio/open_flow10/echo/request'
8
11
  require 'pio/open_flow10/error'
9
12
  require 'pio/open_flow10/error/bad_request'
10
13
  require 'pio/open_flow10/error/hello_failed'
11
- require 'pio/open_flow10/exact_match'
12
- require 'pio/open_flow10/features'
14
+ require 'pio/open_flow10/features/reply'
15
+ require 'pio/open_flow10/features/request'
13
16
  require 'pio/open_flow10/flow_mod'
14
- require 'pio/open_flow10/flow_stats_reply'
15
- require 'pio/open_flow10/flow_stats_request'
17
+ require 'pio/open_flow10/flow_stats/reply'
18
+ require 'pio/open_flow10/flow_stats/request'
16
19
  require 'pio/open_flow10/hello'
17
20
  require 'pio/open_flow10/packet_in'
18
21
  require 'pio/open_flow10/packet_out'
19
- require 'pio/open_flow10/phy_port16'
20
- require 'pio/open_flow10/port16'
21
22
  require 'pio/open_flow10/port_status'
22
- require 'pio/open_flow10/send_out_port'
23
- require 'pio/open_flow10/stats_reply'
24
23
  require 'pio/open_flow10/stats_request'
24
+
25
+ # Actions
26
+ require 'pio/open_flow10/send_out_port'
27
+
28
+ # Misc.
29
+ require 'pio/open_flow10/exact_match'
@@ -0,0 +1,20 @@
1
+ require 'pio/open_flow10/stats_type'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # Aggregate Stats messages
6
+ module AggregateStats
7
+ # Aggregate Stats Reply message
8
+ class Reply < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 17, message_length: 32
10
+ stats_type :stats_type, value: -> { :aggregate }
11
+ uint16 :flags
12
+ uint64 :packet_count
13
+ uint64 :byte_count
14
+ uint32 :flow_count
15
+ string :padding, length: 4
16
+ hide :padding
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'pio/open_flow/message'
2
+ require 'pio/open_flow10/match10'
3
+ require 'pio/open_flow10/port16'
4
+ require 'pio/open_flow10/stats_type'
5
+
6
+ module Pio
7
+ module OpenFlow10
8
+ # OpenFlow 1.0 Aggregate Stats messages
9
+ module AggregateStats
10
+ # OpenFlow 1.0 Aggregate Stats Request message
11
+ class Request < OpenFlow::Message
12
+ open_flow_header version: 1,
13
+ message_type: 16,
14
+ message_length: 56
15
+ stats_type :stats_type, value: -> { :aggregate }
16
+ uint16 :flags
17
+ match10 :match
18
+ uint8 :table_id, initial_value: 0xff
19
+ string :padding, length: 1
20
+ hide :padding
21
+ port16 :out_port, initial_value: -> { :none }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ require 'pio/open_flow/message'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # OpenFlow 1.0 Barrier messages
6
+ module Barrier
7
+ # OpenFlow 1.0 Barrier Request message
8
+ class Reply < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 19
10
+ string :body, value: ''
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'pio/open_flow/message'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # OpenFlow 1.0 Barrier messages
6
+ module Barrier
7
+ # OpenFlow 1.0 Barrier Request message
8
+ class Request < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 18
10
+ string :body, value: ''
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'pio/open_flow10/stats_type'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # OpenFlow 1.0 Description Stats messages
6
+ module DescriptionStats
7
+ # OpenFlow 1.0 Description Stats Reply message
8
+ class Reply < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 17, message_length: 1068
10
+ stats_type :stats_type, value: -> { :description }
11
+ uint16 :flags
12
+
13
+ stringz :manufacturer, length: 256
14
+ stringz :hardware, length: 256
15
+ stringz :software, length: 256
16
+ stringz :serial_number, length: 32
17
+ stringz :datapath, length: 256
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'pio/open_flow10/stats_type'
2
+ require 'pio/open_flow/message'
3
+
4
+ module Pio
5
+ module OpenFlow10
6
+ # OpenFlow 1.0 Description Stats messages
7
+ module DescriptionStats
8
+ # OpenFlow 1.0 Description Stats Request message
9
+ class Request < OpenFlow::Message
10
+ open_flow_header version: 1,
11
+ message_type: 16,
12
+ message_length: 12
13
+ stats_type :stats_type, value: -> { :description }
14
+ uint16 :flags
15
+ string :body, value: ''
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ require 'pio/open_flow/message'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # OpenFlow 1.0 Echo Request and Reply message.
6
+ module Echo
7
+ # OpenFlow 1.0 Echo Reply message.
8
+ class Reply < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 3
10
+ string :body, read_length: -> { message_length - 8 }
11
+
12
+ alias_method :user_data, :body
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'pio/open_flow/message'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # OpenFlow 1.0 Echo Request and Reply message.
6
+ module Echo
7
+ # OpenFlow 1.0 Echo Request message.
8
+ class Request < OpenFlow::Message
9
+ open_flow_header version: 1, message_type: 2
10
+ string :body, read_length: -> { message_length - 8 }
11
+
12
+ alias_method :user_data, :body
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,3 @@
1
- require 'bindata'
2
- require 'pio/open_flow/format'
3
1
  require 'pio/open_flow/message'
4
2
  require 'pio/open_flow10/error/error_type10'
5
3
 
@@ -8,58 +6,38 @@ module Pio
8
6
  module Error
9
7
  # Bad request error.
10
8
  class BadRequest < OpenFlow::Message
11
- # Bad request error format.
12
- class Format < BinData::Record
13
- # Bad request error body.
14
- class Body < BinData::Record
15
- # enum ofp_bad_request_code
16
- class BadRequestCode < BinData::Primitive
17
- ERROR_CODES = {
18
- bad_version: 0,
19
- bad_type: 1,
20
- bad_stats: 2,
21
- bad_vendor: 3,
22
- bad_subtype: 4,
23
- permissions_error: 5,
24
- bad_length: 6,
25
- buffer_empty: 7,
26
- buffer_unknown: 8
27
- }
28
-
29
- endian :big
30
- uint16 :error_code
31
-
32
- def get
33
- ERROR_CODES.invert.fetch(error_code)
34
- end
35
-
36
- def set(value)
37
- self.error_code = ERROR_CODES.fetch(value)
38
- end
39
- end
40
-
41
- endian :big
42
-
43
- error_type10 :error_type, value: -> { :bad_request }
44
- bad_request_code :error_code
45
- rest :raw_data
46
-
47
- def length
48
- 4 + raw_data.length
49
- end
9
+ # enum ofp_bad_request_code
10
+ class BadRequestCode < BinData::Primitive
11
+ ERROR_CODES = {
12
+ bad_version: 0,
13
+ bad_type: 1,
14
+ bad_stats: 2,
15
+ bad_vendor: 3,
16
+ bad_subtype: 4,
17
+ permissions_error: 5,
18
+ bad_length: 6,
19
+ buffer_empty: 7,
20
+ buffer_unknown: 8
21
+ }
22
+
23
+ endian :big
24
+ uint16 :error_code
25
+
26
+ def get
27
+ ERROR_CODES.invert.fetch(error_code)
50
28
  end
51
29
 
52
- extend OpenFlow::Format
53
-
54
- header version: 1, message_type: 1
55
- body :body
56
-
57
- def length
58
- 8 + body.length
30
+ def set(value)
31
+ self.error_code = ERROR_CODES.fetch(value)
59
32
  end
60
33
  end
61
34
 
62
- body_option :raw_data
35
+ open_flow_header version: 1,
36
+ message_type: 1,
37
+ message_length: -> { 12 + raw_data.length }
38
+ error_type10 :error_type, value: -> { :bad_request }
39
+ bad_request_code :error_code
40
+ rest :raw_data
63
41
  end
64
42
  end
65
43
  end
@@ -1,4 +1,3 @@
1
- require 'pio/open_flow/format'
2
1
  require 'pio/open_flow/hello_failed_code'
3
2
  require 'pio/open_flow/message'
4
3
  require 'pio/open_flow10/error/error_type10'
@@ -8,33 +7,12 @@ module Pio
8
7
  module Error
9
8
  # Hello failed error.
10
9
  class HelloFailed < OpenFlow::Message
11
- # Hello Failed error format.
12
- class Format < BinData::Record
13
- # Hello Failed error body.
14
- class Body < BinData::Record
15
- endian :big
16
-
17
- error_type10 :error_type
18
- hello_failed_code :error_code
19
- rest :description
20
-
21
- def length
22
- 4 + description.length
23
- end
24
- end
25
-
26
- extend OpenFlow::Format
27
-
28
- header version: 1, message_type: 1
29
- body :body
30
-
31
- def length
32
- 8 + body.length
33
- end
34
- end
35
-
36
- body_option :error_code
37
- body_option :description
10
+ open_flow_header version: 1,
11
+ message_type: 1,
12
+ message_length: -> { 12 + description.length }
13
+ error_type10 :error_type
14
+ hello_failed_code :error_code
15
+ rest :description
38
16
  end
39
17
  end
40
18
  end
@@ -1,49 +1,14 @@
1
1
  require 'pio/open_flow10/match'
2
- require 'pio/parser'
3
2
 
4
3
  module Pio
5
4
  # OpenFlow 1.0 exact match
6
5
  class ExactMatch
7
- # rubocop:disable MethodLength
8
- # rubocop:disable AbcSize
9
6
  def initialize(packet_in)
10
- data = packet_in.data
11
- case data
12
- when Pio::Parser::IPv4Packet
13
- options = {
14
- in_port: packet_in.in_port,
15
- ether_source_address: packet_in.source_mac,
16
- ether_destination_address: packet_in.destination_mac,
17
- vlan_vid: data.vlan_vid,
18
- vlan_priority: data.vlan_pcp,
19
- ether_type: data.ether_type,
20
- ip_tos: data.ip_type_of_service,
21
- ip_protocol: data.ip_protocol,
22
- ip_source_address: data.ip_source_address,
23
- ip_destination_address: data.ip_destination_address,
24
- transport_source_port: data.transport_source_port,
25
- transport_destination_port: data.transport_destination_port
26
- }
27
- when Arp::Request
28
- options = {
29
- in_port: packet_in.in_port,
30
- ether_source_address: packet_in.source_mac,
31
- ether_destination_address: packet_in.destination_mac,
32
- vlan_vid: data.vlan_vid,
33
- vlan_priority: data.vlan_pcp,
34
- ether_type: data.ether_type,
35
- ip_tos: 0,
36
- ip_protocol: data.operation,
37
- ip_source_address: data.sender_protocol_address,
38
- ip_destination_address: data.target_protocol_address,
39
- transport_source_port: 0,
40
- transport_destination_port: 0
41
- }
42
- end
43
- @match = Pio::Match.new(options)
7
+ @match = packet_in.data.to_exact_match(packet_in.in_port)
8
+ rescue NoMethodError
9
+ raise NotImplementedError,
10
+ "#{packet_in.data.class} is not yet supported by ExactMatch."
44
11
  end
45
- # rubocop:enable MethodLength
46
- # rubocop:enable AbcSize
47
12
 
48
13
  def method_missing(method, *args, &block)
49
14
  @match.__send__ method, *args, &block
@@ -1,5 +1,6 @@
1
1
  require 'pio/open_flow'
2
2
  require 'pio/open_flow10/phy_port16'
3
+ require 'pio/open_flow10/port16'
3
4
 
4
5
  module Pio
5
6
  module OpenFlow10
@@ -7,89 +8,64 @@ module Pio
7
8
  class Features
8
9
  # OpenFlow 1.0 Features Reply message.
9
10
  class Reply < OpenFlow::Message
10
- # Message body of features reply.
11
- class Body < BinData::Record
12
- extend OpenFlow::Flags
11
+ extend OpenFlow::Flags
13
12
 
14
- # enum ofp_capabilities
15
- flags_32bit :capabilities,
16
- [:flow_stats,
17
- :table_stats,
18
- :port_stats,
19
- :stp,
20
- :reserved,
21
- :ip_reasm,
22
- :queue_stats,
23
- :arp_match_ip]
13
+ # enum ofp_capabilities
14
+ flags_32bit :capabilities,
15
+ [:flow_stats,
16
+ :table_stats,
17
+ :port_stats,
18
+ :stp,
19
+ :reserved,
20
+ :ip_reasm,
21
+ :queue_stats,
22
+ :arp_match_ip]
24
23
 
25
- # enum ofp_action_type
26
- flags_32bit :actions_flag,
27
- [:output,
28
- :set_vlan_vid,
29
- :set_vlan_pcp,
30
- :strip_vlan,
31
- :set_ether_source_address,
32
- :set_ether_destination_address,
33
- :set_ip_source_address,
34
- :set_ip_destination_address,
35
- :set_ip_tos,
36
- :set_transport_source_port,
37
- :set_transport_destination_port,
38
- :enqueue]
24
+ # enum ofp_action_type
25
+ flags_32bit :actions_flag,
26
+ [:output,
27
+ :set_vlan_vid,
28
+ :set_vlan_pcp,
29
+ :strip_vlan,
30
+ :set_ether_source_address,
31
+ :set_ether_destination_address,
32
+ :set_ip_source_address,
33
+ :set_ip_destination_address,
34
+ :set_ip_tos,
35
+ :set_transport_source_port,
36
+ :set_transport_destination_port,
37
+ :enqueue]
39
38
 
40
- endian :big
39
+ open_flow_header version: 1,
40
+ message_type: 6,
41
+ message_length: -> { 32 + ports.to_binary_s.length }
41
42
 
42
- datapath_id :datapath_id
43
- uint32 :n_buffers
44
- uint8 :n_tables
45
- uint24 :padding
46
- hide :padding
47
- capabilities :capabilities
48
- actions_flag :actions
49
- array :ports, type: :phy_port16, read_until: :eof
43
+ datapath_id :datapath_id
44
+ uint32 :n_buffers
45
+ uint8 :n_tables
46
+ uint24 :padding
47
+ hide :padding
48
+ capabilities :capabilities
49
+ actions_flag :actions
50
+ array :ports, type: :phy_port16, read_until: :eof
50
51
 
51
- def empty?
52
- false
53
- end
54
-
55
- def length
56
- 24 + ports.to_binary_s.length
57
- end
52
+ def datapath_id
53
+ @format.datapath_id.to_i
58
54
  end
55
+ alias_method :dpid, :datapath_id
59
56
 
60
- # OpenFlow 1.0 Features Reply message
61
- class Format < BinData::Record
62
- extend OpenFlow::Format
63
-
64
- header version: 1, message_type: 6
65
- body :body
66
-
67
- def ports
68
- body.snapshot.ports.map do |each|
69
- each.instance_variable_set :@datapath_id, datapath_id
70
- each
71
- end
72
- end
73
-
74
- def physical_ports
75
- ports.select do |each|
76
- each.port_no <= Port16::MAX
77
- end
57
+ def ports
58
+ snapshot.ports.map do |each|
59
+ each.instance_variable_set :@datapath_id, datapath_id
60
+ each
78
61
  end
62
+ end
79
63
 
80
- def datapath_id
81
- body.datapath_id.to_i
64
+ def physical_ports
65
+ ports.select do |each|
66
+ each.port_no <= OpenFlow10::Port16::MAX
82
67
  end
83
- alias_method :dpid, :datapath_id
84
68
  end
85
-
86
- body_option :dpid
87
- body_option :datapath_id
88
- body_option :n_buffers
89
- body_option :n_tables
90
- body_option :capabilities
91
- body_option :actions
92
- body_option :ports
93
69
  end
94
70
  end
95
71
  end