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,12 @@
1
+ require 'openflow-protocol/structs/port_number'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PortStatisticsRequest < BinData::Record
6
+ endian :big
7
+ port_number :port_number, initial_value: -> { :none } # all ports
8
+ uint48 :padding
9
+ hide :padding
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ require 'openflow-protocol/structs/port_number'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueueStatisticsReply < BinData::Record
6
+ endian :big
7
+ port_number :port_number, initial_value: 0
8
+ uint16 :padding
9
+ hide :padding
10
+ uint32 :queue_id, initial_value: 0
11
+ uint64 :transmit_bytes, initial_value: 0
12
+ uint64 :transmit_packets, initial_value: 0
13
+ uint64 :transmit_errors, initial_value: 0
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ require 'openflow-protocol/structs/port_number'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueueStatisticsRequest < BinData::Record
6
+ endian :big
7
+ port_number :port_number, initial_value: -> { :all }
8
+ uint16 :padding
9
+ hide :padding
10
+ enum32 :queue_id, list: {all: 0xffffffff}, initial_value: -> { :all }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require 'openflow-protocol/structs/match'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class TableStatistics < BinData::Record
6
+ TABLE_IDS = {emergency: 0xfe, all: 0xff}
7
+
8
+ endian :big
9
+ enum8 :table_id, list: TABLE_IDS, initial_value: 0
10
+ uint24 :padding
11
+ hide :padding
12
+ string :name, length: 32, trim_padding: true, initial_value: ''
13
+ flags32 :wildcards, list: Match::Wildcards::FLAGS
14
+ uint32 :max_entries, initial_value: 0
15
+ uint32 :active_count, initial_value: 0
16
+ uint64 :lookup_count, initial_value: 0
17
+ uint64 :matched_count, initial_value: 0
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ require 'bindata'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class VendorStatistics < BinData::Record
6
+ endian :big
7
+ uint32 :vendor, initial_value: 0
8
+ rest :body
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require 'openflow-protocol/messages/statistics'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class StatisticsReply < Statistics
6
+ FLAGS = [:reply_more]
7
+
8
+ choice :statistics, selection: -> { statistic_type.to_s } do
9
+ description_statistics 'description'
10
+ flow_statistics_reply 'flow'
11
+ aggregate_statistics_reply 'aggregate'
12
+ array 'table',
13
+ type: :table_statistics,
14
+ initial_length: -> { (len - statistics.rel_offset) / 64 }
15
+ array 'port',
16
+ type: :port_statistics_reply,
17
+ initial_length: -> { (len - statistics.rel_offset) / 104 }
18
+ array 'queue',
19
+ type: :queue_statistics_reply,
20
+ initial_length: -> { (len - statistics.rel_offset) / 32 }
21
+ vendor_statistics 'vendor'
22
+ rest :default
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ require 'openflow-protocol/messages/statistics'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class StatisticsRequest < Statistics
6
+ FLAGS = []
7
+
8
+ choice :statistics, selection: -> { statistic_type.to_s } do
9
+ flow_statistics_request 'flow'
10
+ aggregate_statistics_request 'aggregate'
11
+ port_statistics_request 'port'
12
+ queue_statistics_request 'queue'
13
+ vendor_statistics 'vendor'
14
+ rest :default
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'openflow-protocol/messages/message'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class Vendor < Message
6
+ uint32 :vendor, initial_value: 0
7
+ rest :data
8
+
9
+ def body_length
10
+ 4 + data.length
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,106 @@
1
+ require 'English'
2
+ require 'bindata-contrib'
3
+ require 'openflow-protocol/structs/port_number'
4
+
5
+ module OpenFlow
6
+ module Protocol
7
+ class Match < BinData::Record
8
+ class Wildcards < BinData::Primitive
9
+ FLAGS = {
10
+ in_port: 1 << 0,
11
+ vlan_id: 1 << 1,
12
+ mac_source: 1 << 2,
13
+ mac_destination: 1 << 3,
14
+ mac_protocol: 1 << 4,
15
+ ip_protocol: 1 << 5,
16
+ source_port: 1 << 6,
17
+ destination_port: 1 << 7,
18
+ ip_source0: 1 << 8,
19
+ ip_source1: 1 << 9,
20
+ ip_source2: 1 << 10,
21
+ ip_source3: 1 << 11,
22
+ ip_source4: 1 << 12,
23
+ ip_source_all: 1 << 13,
24
+ ip_destination0: 1 << 14,
25
+ ip_destination1: 1 << 15,
26
+ ip_destination2: 1 << 16,
27
+ ip_destination3: 1 << 17,
28
+ ip_destination4: 1 << 18,
29
+ ip_destination_all: 1 << 19,
30
+ vlan_pcp: 1 << 20,
31
+ ip_tos: 1 << 21
32
+ }
33
+ ALL_FLAGS = Hash[
34
+ FLAGS.keys.select { |key| /^ip_(source|destination)\d$/ !~ key }
35
+ .map { |key| [key, true] }
36
+ ]
37
+
38
+ endian :big
39
+ uint32 :flags, initial_value: 0x003820ff # all
40
+
41
+ def get
42
+ FLAGS.each_with_object(Hash.new(0)) do |(key, bit), memo|
43
+ next if flags & bit == 0
44
+ if /^(ip_source|ip_destination)(\d)/ =~ key
45
+ memo[$LAST_MATCH_INFO[1].to_sym] |= 1 << $LAST_MATCH_INFO[2].to_i
46
+ else
47
+ memo[key] = true
48
+ end
49
+ end
50
+ end
51
+
52
+ def set(value)
53
+ value = Hash[value.map { |v| [v, true] }] if value.is_a?(Array)
54
+ self.flags = value.inject(0) do |memo, (key, val)|
55
+ memo |
56
+ case key
57
+ when :ip_source, :ip_destination
58
+ (val & 31) << (key == :ip_source ? 8 : 14)
59
+ else
60
+ val ? FLAGS.fetch(key) : 0
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def self.create(options = {})
67
+ unless options[:wildcards]
68
+ options[:wildcards] = {}
69
+ %i(in_port vlan_id mac_source mac_destination mac_protocol ip_protocol source_port destination_port ip_source ip_destination vlan_pcp ip_tos).each do |flag|
70
+ wild_flag = flag
71
+ wild_flag = "#{flag}_all".to_sym if %i(ip_source ip_destination).include? flag
72
+ options[:wildcards][wild_flag] = true unless options[flag]
73
+ end
74
+ end
75
+ self.new options
76
+ end
77
+
78
+ endian :big
79
+ wildcards :wildcards
80
+ port_number :in_port, initial_value: 0
81
+ mac_address :mac_source
82
+ mac_address :mac_destination
83
+ uint16 :vlan_id, initial_value: 0xffff
84
+ uint8 :vlan_pcp, initial_value: 0
85
+ uint8 :padding
86
+ hide :padding
87
+ enum16 :mac_protocol, list: {
88
+ ipv4: 0x0800,
89
+ arp: 0x0806,
90
+ vlan: 0x8100
91
+ }, initial_value: 0
92
+ uint8 :ip_tos, initial_value: 0
93
+ enum8 :ip_protocol, list: {
94
+ icmp: 1,
95
+ tcp: 6,
96
+ udp: 17
97
+ }, initial_value: 0
98
+ uint16 :padding2
99
+ hide :padding2
100
+ ipv4_address :ip_source
101
+ ipv4_address :ip_destination
102
+ uint16 :source_port, initial_value: 0
103
+ uint16 :destination_port, initial_value: 0
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,14 @@
1
+ require 'openflow-protocol/structs/queue_properties/queue_properties'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PacketQueue < BinData::Record
6
+ endian :big
7
+ uint32 :queue_id, initial_value: 0
8
+ uint16 :len, value: -> { 8 + properties.to_binary_s.length }
9
+ uint16 :padding
10
+ hide :padding
11
+ queue_properties :properties, length: -> { len - 8 }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ require 'bindata-contrib'
2
+ require 'openflow-protocol/structs/port_number'
3
+
4
+ module OpenFlow
5
+ module Protocol
6
+ class PhysicalPort < BinData::Record
7
+ CONFIG = [
8
+ :port_down,
9
+ :no_spanning_tree,
10
+ :no_receive,
11
+ :no_receive_spanning_tree,
12
+ :no_flood,
13
+ :no_forward,
14
+ :no_packet_in
15
+ ]
16
+ STATE = {
17
+ link_down: 1 << 0,
18
+ spanning_tree_listen: 0 << 8,
19
+ spanning_tree_learn: 1 << 8,
20
+ spanning_tree_forward: 2 << 8,
21
+ spanning_tree_block: 3 << 8
22
+ }
23
+ FEATURES = [
24
+ :port_10mb_half_duplex,
25
+ :port_10mb_full_duplex,
26
+ :port_100mb_half_duplex,
27
+ :port_100mb_full_duplex,
28
+ :port_1gb_half_duplex,
29
+ :port_1gb_full_duplex,
30
+ :port_10gb_full_duplex,
31
+ :port_copper,
32
+ :port_fiber,
33
+ :port_auto_negotiation,
34
+ :port_pause,
35
+ :port_pause_asymmetric
36
+ ]
37
+
38
+ endian :big
39
+ port_number :port_number, initial_value: 0
40
+ mac_address :hardware_address
41
+ string :name, length: 16, trim_padding: true, initial_value: ''
42
+ flags32 :config, list: CONFIG
43
+ flags32 :state, list: STATE
44
+ flags32 :current_features, list: FEATURES
45
+ flags32 :advertised_features, list: FEATURES
46
+ flags32 :supported_features, list: FEATURES
47
+ flags32 :peer_features, list: FEATURES
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,49 @@
1
+ require 'bindata'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class PortNumberStrict < BinData::Primitive
6
+ endian :big
7
+ uint16 :port_number, initial_value: 0
8
+
9
+ def get
10
+ port_number
11
+ end
12
+
13
+ def set(value)
14
+ raise ArgumentError, 'Invalid port number.' unless (0..PortNumber::MAX).include? value
15
+ self.port_number = value
16
+ end
17
+ end
18
+
19
+ class PortNumber < BinData::Primitive
20
+ NUMBERS = {
21
+ in_port: 0xfff8,
22
+ table: 0xfff9,
23
+ normal: 0xfffa,
24
+ flood: 0xfffb,
25
+ all: 0xfffc,
26
+ controller: 0xfffd,
27
+ local: 0xfffe,
28
+ none: 0xffff
29
+ }
30
+ MAX = 0xff00
31
+
32
+ endian :big
33
+ uint16 :port_number, initial_value: NUMBERS[:none]
34
+
35
+ def get
36
+ NUMBERS.invert.fetch(port_number)
37
+ rescue KeyError
38
+ port_number
39
+ end
40
+
41
+ def set(value)
42
+ self.port_number = NUMBERS.fetch(value)
43
+ rescue KeyError
44
+ raise ArgumentError, 'Invalid port number.' unless (0..MAX).include? value
45
+ self.port_number = value
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,9 @@
1
+ Dir[File.expand_path '../queue_property_*.rb', __FILE__].each do |file|
2
+ require file
3
+ end
4
+
5
+ module OpenFlow
6
+ module Protocol
7
+ class QueueProperties < ArrayOfSubclasses; end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ Dir[File.expand_path '../../../helpers/**/*.rb', __FILE__].each do |file|
2
+ require file
3
+ end
4
+
5
+ module OpenFlow
6
+ module Protocol
7
+ class QueueProperty < SuperclassBase
8
+ HEADER_LENGTH = 8
9
+ TYPES = [
10
+ :none,
11
+ :min_rate
12
+ ]
13
+
14
+ enum16 :type, list: TYPES, asserted_value: -> { type_str.to_sym }
15
+ uint16 :len, value: -> { HEADER_LENGTH + body_length }
16
+ uint32 :padding
17
+ hide :padding
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ require 'openflow-protocol/structs/queue_properties/queue_property'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueuePropertyMinRate < QueueProperty
6
+ class Rate < BinData::Primitive
7
+ endian :big
8
+ uint16 :rate, initial_value: 0
9
+
10
+ def get
11
+ return :disabled if rate > 1000
12
+ rate
13
+ end
14
+
15
+ def set(value)
16
+ value = 0xffff if value == :disabled
17
+ self.rate = value
18
+ end
19
+ end
20
+
21
+ rate :rate
22
+ uint48 :padding2
23
+ hide :padding2
24
+
25
+ def body_length
26
+ 8
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ require 'openflow-protocol/structs/queue_properties/queue_property'
2
+
3
+ module OpenFlow
4
+ module Protocol
5
+ class QueuePropertyNone < QueueProperty; end
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  module OpenFlow
2
2
  module Protocol
3
- VERSION = '0.1.7'
3
+ VERSION = '0.1.8'
4
4
  end
5
5
  end