openflow-protocol 0.1.7 → 0.1.8

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.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openflow-protocol.rb +2 -1
  3. data/lib/openflow-protocol/actions/action.rb +30 -0
  4. data/lib/openflow-protocol/actions/action_enqueue.rb +16 -0
  5. data/lib/openflow-protocol/actions/action_output.rb +14 -0
  6. data/lib/openflow-protocol/actions/action_set_destination_port.rb +7 -0
  7. data/lib/openflow-protocol/actions/action_set_ip_destination.rb +7 -0
  8. data/lib/openflow-protocol/actions/action_set_ip_source.rb +13 -0
  9. data/lib/openflow-protocol/actions/action_set_ip_tos.rb +15 -0
  10. data/lib/openflow-protocol/actions/action_set_mac_destination.rb +7 -0
  11. data/lib/openflow-protocol/actions/action_set_mac_source.rb +15 -0
  12. data/lib/openflow-protocol/actions/action_set_source_port.rb +15 -0
  13. data/lib/openflow-protocol/actions/action_set_vlan_id.rb +15 -0
  14. data/lib/openflow-protocol/actions/action_set_vlan_pcp.rb +15 -0
  15. data/lib/openflow-protocol/actions/action_strip_vlan.rb +14 -0
  16. data/lib/openflow-protocol/actions/action_vendor.rb +13 -0
  17. data/lib/openflow-protocol/actions/actions.rb +9 -0
  18. data/lib/openflow-protocol/helpers/array_of_subclasses.rb +42 -0
  19. data/lib/openflow-protocol/helpers/superclass_base.rb +26 -0
  20. data/lib/openflow-protocol/messages/barrier_reply.rb +7 -0
  21. data/lib/openflow-protocol/messages/barrier_request.rb +7 -0
  22. data/lib/openflow-protocol/messages/echo_reply.rb +13 -0
  23. data/lib/openflow-protocol/messages/echo_request.rb +13 -0
  24. data/lib/openflow-protocol/messages/error.rb +69 -0
  25. data/lib/openflow-protocol/messages/features_reply.rb +44 -0
  26. data/lib/openflow-protocol/messages/features_request.rb +7 -0
  27. data/lib/openflow-protocol/messages/flow_mod.rb +24 -0
  28. data/lib/openflow-protocol/messages/flow_removed.rb +27 -0
  29. data/lib/openflow-protocol/messages/get_config_reply.rb +16 -0
  30. data/lib/openflow-protocol/messages/get_config_request.rb +7 -0
  31. data/lib/openflow-protocol/messages/hello.rb +7 -0
  32. data/lib/openflow-protocol/messages/message.rb +49 -0
  33. data/lib/openflow-protocol/messages/packet_in.rb +27 -0
  34. data/lib/openflow-protocol/messages/packet_out.rb +17 -0
  35. data/lib/openflow-protocol/messages/parser.rb +26 -0
  36. data/lib/openflow-protocol/messages/port_mod.rb +19 -0
  37. data/lib/openflow-protocol/messages/port_status.rb +18 -0
  38. data/lib/openflow-protocol/messages/queue_get_config_reply.rb +18 -0
  39. data/lib/openflow-protocol/messages/queue_get_config_request.rb +15 -0
  40. data/lib/openflow-protocol/messages/set_config.rb +7 -0
  41. data/lib/openflow-protocol/messages/statistics.rb +28 -0
  42. data/lib/openflow-protocol/messages/statistics/aggregate_statistics_reply.rb +14 -0
  43. data/lib/openflow-protocol/messages/statistics/aggregate_statistics_request.rb +7 -0
  44. data/lib/openflow-protocol/messages/statistics/description_statistics.rb +32 -0
  45. data/lib/openflow-protocol/messages/statistics/flow_statistics_reply.rb +25 -0
  46. data/lib/openflow-protocol/messages/statistics/flow_statistics_request.rb +14 -0
  47. data/lib/openflow-protocol/messages/statistics/port_statistics_reply.rb +24 -0
  48. data/lib/openflow-protocol/messages/statistics/port_statistics_request.rb +12 -0
  49. data/lib/openflow-protocol/messages/statistics/queue_statistics_reply.rb +16 -0
  50. data/lib/openflow-protocol/messages/statistics/queue_statistics_request.rb +13 -0
  51. data/lib/openflow-protocol/messages/statistics/table_statistics.rb +20 -0
  52. data/lib/openflow-protocol/messages/statistics/vendor_statistics.rb +11 -0
  53. data/lib/openflow-protocol/messages/statistics_reply.rb +26 -0
  54. data/lib/openflow-protocol/messages/statistics_request.rb +18 -0
  55. data/lib/openflow-protocol/messages/vendor.rb +14 -0
  56. data/lib/openflow-protocol/structs/match.rb +106 -0
  57. data/lib/openflow-protocol/structs/packet_queue.rb +14 -0
  58. data/lib/openflow-protocol/structs/physical_port.rb +50 -0
  59. data/lib/openflow-protocol/structs/port_number.rb +49 -0
  60. data/lib/openflow-protocol/structs/queue_properties/queue_properties.rb +9 -0
  61. data/lib/openflow-protocol/structs/queue_properties/queue_property.rb +20 -0
  62. data/lib/openflow-protocol/structs/queue_properties/queue_property_min_rate.rb +30 -0
  63. data/lib/openflow-protocol/structs/queue_properties/queue_property_none.rb +7 -0
  64. data/lib/openflow-protocol/version.rb +1 -1
  65. data/spec/actions/action_enqueue_spec.rb +4 -6
  66. data/spec/actions/action_output_spec.rb +4 -6
  67. data/spec/actions/action_set_destination_port_spec.rb +4 -6
  68. data/spec/actions/action_set_ip_destination_spec.rb +4 -6
  69. data/spec/actions/action_set_ip_source_spec.rb +4 -6
  70. data/spec/actions/action_set_ip_tos_spec.rb +4 -6
  71. data/spec/actions/action_set_mac_destination_spec.rb +4 -6
  72. data/spec/actions/action_set_mac_source_spec.rb +4 -6
  73. data/spec/actions/action_set_source_port_spec.rb +4 -6
  74. data/spec/actions/action_set_vlan_id_spec.rb +4 -6
  75. data/spec/actions/action_set_vlan_pcp_spec.rb +4 -6
  76. data/spec/actions/action_strip_vlan_spec.rb +3 -5
  77. data/spec/actions/action_vendor_spec.rb +4 -6
  78. data/spec/actions/actions_spec.rb +6 -8
  79. data/spec/messages/barrier_reply_spec.rb +9 -11
  80. data/spec/messages/barrier_request_spec.rb +9 -11
  81. data/spec/messages/echo_reply_spec.rb +13 -15
  82. data/spec/messages/echo_request_spec.rb +16 -18
  83. data/spec/messages/error_spec.rb +23 -20
  84. data/spec/messages/features_reply_spec.rb +11 -13
  85. data/spec/messages/features_request_spec.rb +9 -11
  86. data/spec/messages/flow_mod_spec.rb +12 -14
  87. data/spec/messages/flow_removed_spec.rb +9 -11
  88. data/spec/messages/get_config_reply_spec.rb +9 -11
  89. data/spec/messages/get_config_request_spec.rb +9 -11
  90. data/spec/messages/hello_spec.rb +9 -11
  91. data/spec/messages/packet_in_spec.rb +9 -11
  92. data/spec/messages/packet_out_spec.rb +10 -12
  93. data/spec/messages/parser_spec.rb +7 -9
  94. data/spec/messages/port_mod_spec.rb +9 -11
  95. data/spec/messages/port_status_spec.rb +10 -12
  96. data/spec/messages/queue_get_config_reply_spec.rb +9 -11
  97. data/spec/messages/queue_get_config_request_spec.rb +9 -11
  98. data/spec/messages/set_config_spec.rb +9 -11
  99. data/spec/messages/statistics/aggregate_statistics_reply_spec.rb +4 -6
  100. data/spec/messages/statistics/aggregate_statistics_request_spec.rb +4 -6
  101. data/spec/messages/statistics/description_statistics_spec.rb +11 -9
  102. data/spec/messages/statistics/flow_statistics_reply_spec.rb +4 -6
  103. data/spec/messages/statistics/flow_statistics_request_spec.rb +4 -6
  104. data/spec/messages/statistics/port_statistics_reply_spec.rb +4 -6
  105. data/spec/messages/statistics/port_statistics_request_spec.rb +4 -6
  106. data/spec/messages/statistics/queue_statistics_reply_spec.rb +4 -6
  107. data/spec/messages/statistics/queue_statistics_request_spec.rb +4 -6
  108. data/spec/messages/statistics/table_statistics_spec.rb +4 -6
  109. data/spec/messages/statistics/vendor_statistics_spec.rb +4 -6
  110. data/spec/messages/statistics_reply_spec.rb +62 -64
  111. data/spec/messages/statistics_request_spec.rb +45 -47
  112. data/spec/messages/vendor_spec.rb +13 -15
  113. data/spec/spec_helper.rb +1 -1
  114. data/spec/structs/match_spec.rb +7 -9
  115. data/spec/structs/packet_queue_spec.rb +5 -7
  116. data/spec/structs/physical_port_spec.rb +16 -18
  117. data/spec/structs/port_number_spec.rb +11 -13
  118. data/spec/structs/queue_properties/queue_properties_spec.rb +5 -7
  119. data/spec/structs/queue_properties/queue_property_min_rate_spec.rb +5 -7
  120. data/spec/structs/queue_properties/queue_property_none_spec.rb +3 -5
  121. metadata +78 -64
  122. data/lib/actions/action.rb +0 -26
  123. data/lib/actions/action_enqueue.rb +0 -12
  124. data/lib/actions/action_output.rb +0 -10
  125. data/lib/actions/action_set_destination_port.rb +0 -3
  126. data/lib/actions/action_set_ip_destination.rb +0 -3
  127. data/lib/actions/action_set_ip_source.rb +0 -9
  128. data/lib/actions/action_set_ip_tos.rb +0 -11
  129. data/lib/actions/action_set_mac_destination.rb +0 -3
  130. data/lib/actions/action_set_mac_source.rb +0 -11
  131. data/lib/actions/action_set_source_port.rb +0 -11
  132. data/lib/actions/action_set_vlan_id.rb +0 -11
  133. data/lib/actions/action_set_vlan_pcp.rb +0 -11
  134. data/lib/actions/action_strip_vlan.rb +0 -10
  135. data/lib/actions/action_vendor.rb +0 -9
  136. data/lib/actions/actions.rb +0 -5
  137. data/lib/helpers/array_of_subclasses.rb +0 -38
  138. data/lib/helpers/superclass_base.rb +0 -24
  139. data/lib/messages/barrier_reply.rb +0 -3
  140. data/lib/messages/barrier_request.rb +0 -3
  141. data/lib/messages/echo_reply.rb +0 -9
  142. data/lib/messages/echo_request.rb +0 -9
  143. data/lib/messages/error.rb +0 -61
  144. data/lib/messages/features_reply.rb +0 -40
  145. data/lib/messages/features_request.rb +0 -3
  146. data/lib/messages/flow_mod.rb +0 -20
  147. data/lib/messages/flow_removed.rb +0 -23
  148. data/lib/messages/get_config_reply.rb +0 -12
  149. data/lib/messages/get_config_request.rb +0 -3
  150. data/lib/messages/hello.rb +0 -3
  151. data/lib/messages/message.rb +0 -45
  152. data/lib/messages/packet_in.rb +0 -23
  153. data/lib/messages/packet_out.rb +0 -13
  154. data/lib/messages/parser.rb +0 -22
  155. data/lib/messages/port_mod.rb +0 -15
  156. data/lib/messages/port_status.rb +0 -14
  157. data/lib/messages/queue_get_config_reply.rb +0 -14
  158. data/lib/messages/queue_get_config_request.rb +0 -11
  159. data/lib/messages/set_config.rb +0 -3
  160. data/lib/messages/statistics.rb +0 -24
  161. data/lib/messages/statistics/aggregate_statistics_reply.rb +0 -10
  162. data/lib/messages/statistics/aggregate_statistics_request.rb +0 -3
  163. data/lib/messages/statistics/description_statistics.rb +0 -28
  164. data/lib/messages/statistics/flow_statistics_reply.rb +0 -21
  165. data/lib/messages/statistics/flow_statistics_request.rb +0 -10
  166. data/lib/messages/statistics/port_statistics_reply.rb +0 -20
  167. data/lib/messages/statistics/port_statistics_request.rb +0 -8
  168. data/lib/messages/statistics/queue_statistics_reply.rb +0 -12
  169. data/lib/messages/statistics/queue_statistics_request.rb +0 -9
  170. data/lib/messages/statistics/table_statistics.rb +0 -16
  171. data/lib/messages/statistics/vendor_statistics.rb +0 -7
  172. data/lib/messages/statistics_reply.rb +0 -22
  173. data/lib/messages/statistics_request.rb +0 -14
  174. data/lib/messages/vendor.rb +0 -10
  175. data/lib/structs/match.rb +0 -102
  176. data/lib/structs/packet_queue.rb +0 -10
  177. data/lib/structs/physical_port.rb +0 -46
  178. data/lib/structs/port_number.rb +0 -45
  179. data/lib/structs/queue_properties/queue_properties.rb +0 -5
  180. data/lib/structs/queue_properties/queue_property.rb +0 -16
  181. data/lib/structs/queue_properties/queue_property_min_rate.rb +0 -26
  182. data/lib/structs/queue_properties/queue_property_none.rb +0 -3
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class FeaturesRequest < Message; end
6
+ end
7
+ end
@@ -0,0 +1,24 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class FlowMod < Message
6
+ match :match
7
+ uint64 :cookie, initial_value: 0
8
+ enum16 :command, list: [:add, :modify, :modify_strict, :delete, :delete_strict]
9
+ uint16 :idle_timeout, initial_value: 0
10
+ uint16 :hard_timeout, initial_value: 0
11
+ uint16 :priority, initial_value: 0
12
+ enum32 :buffer_id, list: {none: 0xffffffff}, initial_value: -> { :none }
13
+ port_number :out_port, initial_value: (lambda do
14
+ /^delete/ =~ command.to_s ? :none : 0
15
+ end)
16
+ flags16 :flags, list: [:send_flow_removed, :check_overlapping, :emergency]
17
+ actions :actions, length: -> { len - actions.rel_offset }
18
+
19
+ def body_length
20
+ 64 + actions.to_binary_s.length
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class FlowRemoved < Message
6
+ REASONS = [:idle_timeout, :hard_timeout, :delete]
7
+
8
+ match :match
9
+ uint64 :cookie, initial_value: 0
10
+ uint16 :priority, initial_value: 0
11
+ enum8 :reason, list: REASONS
12
+ uint8 :padding
13
+ hide :padding
14
+ uint32 :duration_seconds, initial_value: 0
15
+ uint32 :duration_nanoseconds, initial_value: 0
16
+ uint16 :idle_timeout, initial_value: 0
17
+ uint16 :padding2
18
+ hide :padding2
19
+ uint64 :packet_count, initial_value: 0
20
+ uint64 :byte_count, initial_value: 0
21
+
22
+ def body_length
23
+ 80
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class GetConfigReply < Message
6
+ FLAGS = [:fragments_normal, :fragments_drop, :fragments_reassemble]
7
+
8
+ enum16 :flags, list: FLAGS
9
+ uint16 :miss_send_length, initial_value: 0
10
+
11
+ def body_length
12
+ 4
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class GetConfigRequest < Message; end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class Hello < Message; end
6
+ end
7
+ end
@@ -0,0 +1,49 @@
1
+ (Dir[File.expand_path '../../helpers/**/*.rb', __FILE__] +
2
+ Dir[File.expand_path '../../structs/**/*.rb', __FILE__] +
3
+ Dir[File.expand_path '../../actions/**/*.rb', __FILE__] +
4
+ Dir[File.expand_path '../statistics/**/*.rb', __FILE__]).each do |file|
5
+ require file
6
+ end
7
+
8
+ # TODO: use OFPT_, OFPP_, OFPQ_, ... in place of Symbols?
9
+ # check: https://github.com/noxrepo/pox/blob/carp/pox/openflow/libopenflow_01.py
10
+ # -> see decorators
11
+ # ruby decorators: https://github.com/fredwu/ruby_decorators
12
+
13
+ module OpenFlow
14
+ module Protocol
15
+ class Message < SuperclassBase
16
+ OFP_VERSION = 0x1
17
+ HEADER_LENGTH = 8
18
+ TYPES = [
19
+ :hello,
20
+ :error,
21
+ :echo_request,
22
+ :echo_reply,
23
+ :vendor,
24
+ :features_request,
25
+ :features_reply,
26
+ :get_config_request,
27
+ :get_config_reply,
28
+ :set_config,
29
+ :packet_in,
30
+ :flow_removed,
31
+ :port_status,
32
+ :packet_out,
33
+ :flow_mod,
34
+ :port_mod,
35
+ :statistics_request,
36
+ :statistics_reply,
37
+ :barrier_request,
38
+ :barrier_reply,
39
+ :queue_get_config_request,
40
+ :queue_get_config_reply
41
+ ]
42
+
43
+ uint8 :version, asserted_value: OFP_VERSION
44
+ enum8 :type, list: TYPES, asserted_value: -> { type_str.to_sym }
45
+ uint16 :len, value: -> { HEADER_LENGTH + body_length }
46
+ uint32 :xid, initial_value: 0
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ require 'packet-protocols'
2
+ require 'openflow-protocol/messages/message'
3
+
4
+ module OpenFlow
5
+ module Protocol
6
+ class PacketIn < Message
7
+ REASONS = [:no_match, :action]
8
+
9
+ enum32 :buffer_id, list: {none: 0xffffffff}, initial_value: -> { :none }
10
+ uint16 :total_length, value: -> { data.length }
11
+ port_number :in_port
12
+ enum8 :reason, list: REASONS
13
+ uint8 :padding
14
+ hide :padding
15
+ string :data, read_length: :total_length
16
+
17
+ def body_length
18
+ 10 + data.length
19
+ end
20
+
21
+ def parsed_data
22
+ @parsed_data ||= Ethernet.read(data)
23
+ @parsed_data
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PacketOut < Message
6
+ enum32 :buffer_id, list: {none: 0xffffffff}, initial_value: -> { :none }
7
+ port_number :in_port
8
+ uint16 :actions_length, value: -> { actions.to_binary_s.length }
9
+ actions :actions, length: -> { actions_length }
10
+ string :data, read_length: -> { len - data.rel_offset }
11
+
12
+ def body_length
13
+ 8 + actions_length + data.length
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require 'stringio'
2
+
3
+ Dir[File.expand_path '../*.rb', __FILE__].each do |file|
4
+ require file
5
+ end
6
+
7
+ module OpenFlow
8
+ module Protocol
9
+ class Parser
10
+ def self.read(io)
11
+ io = StringIO.new(io) if io.is_a?(String)
12
+
13
+ header = io.readpartial(Message::HEADER_LENGTH)
14
+
15
+ type = Message::TYPES[header[1].unpack('C')[0].to_i]
16
+ klass_name = type.to_s.split('_').map(&:capitalize).join
17
+ klass = OpenFlow::Protocol.const_get(klass_name)
18
+ length = header[2..3].unpack('S>')[0].to_i
19
+
20
+ body = io.readpartial(length - Message::HEADER_LENGTH)
21
+
22
+ klass.read(header + body)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PortMod < Message
6
+ port_number :port_number
7
+ mac_address :hardware_address
8
+ flags32 :config, list: PhysicalPort::CONFIG
9
+ flags32 :mask, list: PhysicalPort::CONFIG
10
+ flags32 :advertise, list: PhysicalPort::FEATURES
11
+ uint32 :padding
12
+ hide :padding
13
+
14
+ def body_length
15
+ 24
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PortStatus < Message
6
+ REASONS = [:add, :delete, :modify]
7
+
8
+ enum8 :reason, list: REASONS
9
+ uint56 :padding
10
+ hide :padding
11
+ physical_port :desc
12
+
13
+ def body_length
14
+ 56
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueueGetConfigReply < Message
6
+ port_number_strict :port
7
+ uint48 :padding
8
+ hide :padding
9
+ array :queues,
10
+ type: :packet_queue,
11
+ read_until: :eof
12
+
13
+ def body_length
14
+ 8 + queues.to_binary_s.length
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueueGetConfigRequest < Message
6
+ port_number_strict :port
7
+ uint16 :padding
8
+ hide :padding
9
+
10
+ def body_length
11
+ 4
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/messages/get_config_reply'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class SetConfig < GetConfigReply; end
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class Statistics < Message
6
+ STATISTICS_TYPES = [
7
+ :description,
8
+ :flow,
9
+ :aggregate,
10
+ :table,
11
+ :port,
12
+ :queue
13
+ ]
14
+ STATISTICS_TYPES[0xffff] = :vendor
15
+
16
+ def flags_list
17
+ self.class.const_get(:FLAGS)
18
+ end
19
+
20
+ enum16 :statistic_type, list: STATISTICS_TYPES
21
+ flags16 :flags, list: -> { flags_list }
22
+
23
+ def body_length
24
+ 4 + statistics.to_binary_s.length
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ require 'bindata'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class AggregateStatisticsReply < BinData::Record
6
+ endian :big
7
+ uint64 :packet_count, initial_value: 0
8
+ uint64 :byte_count, initial_value: 0
9
+ uint32 :flow_count, initial_value: 0
10
+ uint32 :padding
11
+ hide :padding
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/messages/statistics/flow_statistics_request'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class AggregateStatisticsRequest < FlowStatisticsRequest; end
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ require 'bindata'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class DescriptionStatistics < BinData::Record
6
+ DESCRIPTION_LENGTH = 256
7
+ SERIAL_NUMBER_LENGTH = 32
8
+
9
+ endian :big
10
+ string :manufacturer_description,
11
+ length: DESCRIPTION_LENGTH,
12
+ trim_padding: true,
13
+ initial_value: ''
14
+ string :hardware_description,
15
+ length: DESCRIPTION_LENGTH,
16
+ trim_padding: true,
17
+ initial_value: ''
18
+ string :software_description,
19
+ length: DESCRIPTION_LENGTH,
20
+ trim_padding: true,
21
+ initial_value: ''
22
+ string :serial_number,
23
+ length: SERIAL_NUMBER_LENGTH,
24
+ trim_padding: true,
25
+ initial_value: ''
26
+ string :datapath_description,
27
+ length: DESCRIPTION_LENGTH,
28
+ trim_padding: true,
29
+ initial_value: ''
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ require 'openflow-protocol/messages/statistics/table_statistics'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class FlowStatisticsReply < BinData::Record
6
+ endian :big
7
+ uint16 :len, initial_value: -> { 88 + actions.to_binary_s.length }
8
+ enum8 :table_id, list: TableStatistics::TABLE_IDS, initial_value: -> { :all }
9
+ uint8 :padding
10
+ hide :padding
11
+ match :match
12
+ uint32 :duration_seconds, initial_value: 0
13
+ uint32 :duration_nanoseconds, initial_value: 0
14
+ uint16 :priority, initial_value: 0
15
+ uint16 :idle_timeout, initial_value: 0
16
+ uint16 :hard_timeout, initial_value: 0
17
+ uint48 :padding2
18
+ hide :padding2
19
+ uint64 :cookie, initial_value: 0
20
+ uint64 :packet_count, initial_value: 0
21
+ uint64 :byte_count, initial_value: 0
22
+ actions :actions, length: -> { len - actions.rel_offset }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ require 'openflow-protocol/messages/statistics/table_statistics'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class FlowStatisticsRequest < BinData::Record
6
+ endian :big
7
+ match :match
8
+ enum8 :table_id, list: TableStatistics::TABLE_IDS, initial_value: -> { :all }
9
+ uint8 :padding
10
+ hide :padding
11
+ port_number :out_port, initial_value: -> { :none }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require 'openflow-protocol/structs/port_number'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PortStatisticsReply < BinData::Record
6
+ endian :big
7
+ port_number :port_number, initial_value: 0
8
+ uint48 :padding
9
+ hide :padding
10
+ uint64 :receive_packets, initial_value: 0
11
+ uint64 :transmit_packets, initial_value: 0
12
+ uint64 :receive_bytes, initial_value: 0
13
+ uint64 :transmit_bytes, initial_value: 0
14
+ uint64 :receive_dropped, initial_value: 0
15
+ uint64 :transmit_dropped, initial_value: 0
16
+ uint64 :receive_errors, initial_value: 0
17
+ uint64 :transmit_errors, initial_value: 0
18
+ uint64 :receive_frame_errors, initial_value: 0
19
+ uint64 :receive_overrun_errors, initial_value: 0
20
+ uint64 :receive_crc_errors, initial_value: 0
21
+ uint64 :collisions, initial_value: 0
22
+ end
23
+ end
24
+ end