openflow-protocol 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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