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.
- checksums.yaml +4 -4
- data/lib/openflow-protocol.rb +2 -1
- data/lib/openflow-protocol/actions/action.rb +30 -0
- data/lib/openflow-protocol/actions/action_enqueue.rb +16 -0
- data/lib/openflow-protocol/actions/action_output.rb +14 -0
- data/lib/openflow-protocol/actions/action_set_destination_port.rb +7 -0
- data/lib/openflow-protocol/actions/action_set_ip_destination.rb +7 -0
- data/lib/openflow-protocol/actions/action_set_ip_source.rb +13 -0
- data/lib/openflow-protocol/actions/action_set_ip_tos.rb +15 -0
- data/lib/openflow-protocol/actions/action_set_mac_destination.rb +7 -0
- data/lib/openflow-protocol/actions/action_set_mac_source.rb +15 -0
- data/lib/openflow-protocol/actions/action_set_source_port.rb +15 -0
- data/lib/openflow-protocol/actions/action_set_vlan_id.rb +15 -0
- data/lib/openflow-protocol/actions/action_set_vlan_pcp.rb +15 -0
- data/lib/openflow-protocol/actions/action_strip_vlan.rb +14 -0
- data/lib/openflow-protocol/actions/action_vendor.rb +13 -0
- data/lib/openflow-protocol/actions/actions.rb +9 -0
- data/lib/openflow-protocol/helpers/array_of_subclasses.rb +42 -0
- data/lib/openflow-protocol/helpers/superclass_base.rb +26 -0
- data/lib/openflow-protocol/messages/barrier_reply.rb +7 -0
- data/lib/openflow-protocol/messages/barrier_request.rb +7 -0
- data/lib/openflow-protocol/messages/echo_reply.rb +13 -0
- data/lib/openflow-protocol/messages/echo_request.rb +13 -0
- data/lib/openflow-protocol/messages/error.rb +69 -0
- data/lib/openflow-protocol/messages/features_reply.rb +44 -0
- data/lib/openflow-protocol/messages/features_request.rb +7 -0
- data/lib/openflow-protocol/messages/flow_mod.rb +24 -0
- data/lib/openflow-protocol/messages/flow_removed.rb +27 -0
- data/lib/openflow-protocol/messages/get_config_reply.rb +16 -0
- data/lib/openflow-protocol/messages/get_config_request.rb +7 -0
- data/lib/openflow-protocol/messages/hello.rb +7 -0
- data/lib/openflow-protocol/messages/message.rb +49 -0
- data/lib/openflow-protocol/messages/packet_in.rb +27 -0
- data/lib/openflow-protocol/messages/packet_out.rb +17 -0
- data/lib/openflow-protocol/messages/parser.rb +26 -0
- data/lib/openflow-protocol/messages/port_mod.rb +19 -0
- data/lib/openflow-protocol/messages/port_status.rb +18 -0
- data/lib/openflow-protocol/messages/queue_get_config_reply.rb +18 -0
- data/lib/openflow-protocol/messages/queue_get_config_request.rb +15 -0
- data/lib/openflow-protocol/messages/set_config.rb +7 -0
- data/lib/openflow-protocol/messages/statistics.rb +28 -0
- data/lib/openflow-protocol/messages/statistics/aggregate_statistics_reply.rb +14 -0
- data/lib/openflow-protocol/messages/statistics/aggregate_statistics_request.rb +7 -0
- data/lib/openflow-protocol/messages/statistics/description_statistics.rb +32 -0
- data/lib/openflow-protocol/messages/statistics/flow_statistics_reply.rb +25 -0
- data/lib/openflow-protocol/messages/statistics/flow_statistics_request.rb +14 -0
- data/lib/openflow-protocol/messages/statistics/port_statistics_reply.rb +24 -0
- data/lib/openflow-protocol/messages/statistics/port_statistics_request.rb +12 -0
- data/lib/openflow-protocol/messages/statistics/queue_statistics_reply.rb +16 -0
- data/lib/openflow-protocol/messages/statistics/queue_statistics_request.rb +13 -0
- data/lib/openflow-protocol/messages/statistics/table_statistics.rb +20 -0
- data/lib/openflow-protocol/messages/statistics/vendor_statistics.rb +11 -0
- data/lib/openflow-protocol/messages/statistics_reply.rb +26 -0
- data/lib/openflow-protocol/messages/statistics_request.rb +18 -0
- data/lib/openflow-protocol/messages/vendor.rb +14 -0
- data/lib/openflow-protocol/structs/match.rb +106 -0
- data/lib/openflow-protocol/structs/packet_queue.rb +14 -0
- data/lib/openflow-protocol/structs/physical_port.rb +50 -0
- data/lib/openflow-protocol/structs/port_number.rb +49 -0
- data/lib/openflow-protocol/structs/queue_properties/queue_properties.rb +9 -0
- data/lib/openflow-protocol/structs/queue_properties/queue_property.rb +20 -0
- data/lib/openflow-protocol/structs/queue_properties/queue_property_min_rate.rb +30 -0
- data/lib/openflow-protocol/structs/queue_properties/queue_property_none.rb +7 -0
- data/lib/openflow-protocol/version.rb +1 -1
- data/spec/actions/action_enqueue_spec.rb +4 -6
- data/spec/actions/action_output_spec.rb +4 -6
- data/spec/actions/action_set_destination_port_spec.rb +4 -6
- data/spec/actions/action_set_ip_destination_spec.rb +4 -6
- data/spec/actions/action_set_ip_source_spec.rb +4 -6
- data/spec/actions/action_set_ip_tos_spec.rb +4 -6
- data/spec/actions/action_set_mac_destination_spec.rb +4 -6
- data/spec/actions/action_set_mac_source_spec.rb +4 -6
- data/spec/actions/action_set_source_port_spec.rb +4 -6
- data/spec/actions/action_set_vlan_id_spec.rb +4 -6
- data/spec/actions/action_set_vlan_pcp_spec.rb +4 -6
- data/spec/actions/action_strip_vlan_spec.rb +3 -5
- data/spec/actions/action_vendor_spec.rb +4 -6
- data/spec/actions/actions_spec.rb +6 -8
- data/spec/messages/barrier_reply_spec.rb +9 -11
- data/spec/messages/barrier_request_spec.rb +9 -11
- data/spec/messages/echo_reply_spec.rb +13 -15
- data/spec/messages/echo_request_spec.rb +16 -18
- data/spec/messages/error_spec.rb +23 -20
- data/spec/messages/features_reply_spec.rb +11 -13
- data/spec/messages/features_request_spec.rb +9 -11
- data/spec/messages/flow_mod_spec.rb +12 -14
- data/spec/messages/flow_removed_spec.rb +9 -11
- data/spec/messages/get_config_reply_spec.rb +9 -11
- data/spec/messages/get_config_request_spec.rb +9 -11
- data/spec/messages/hello_spec.rb +9 -11
- data/spec/messages/packet_in_spec.rb +9 -11
- data/spec/messages/packet_out_spec.rb +10 -12
- data/spec/messages/parser_spec.rb +7 -9
- data/spec/messages/port_mod_spec.rb +9 -11
- data/spec/messages/port_status_spec.rb +10 -12
- data/spec/messages/queue_get_config_reply_spec.rb +9 -11
- data/spec/messages/queue_get_config_request_spec.rb +9 -11
- data/spec/messages/set_config_spec.rb +9 -11
- data/spec/messages/statistics/aggregate_statistics_reply_spec.rb +4 -6
- data/spec/messages/statistics/aggregate_statistics_request_spec.rb +4 -6
- data/spec/messages/statistics/description_statistics_spec.rb +11 -9
- data/spec/messages/statistics/flow_statistics_reply_spec.rb +4 -6
- data/spec/messages/statistics/flow_statistics_request_spec.rb +4 -6
- data/spec/messages/statistics/port_statistics_reply_spec.rb +4 -6
- data/spec/messages/statistics/port_statistics_request_spec.rb +4 -6
- data/spec/messages/statistics/queue_statistics_reply_spec.rb +4 -6
- data/spec/messages/statistics/queue_statistics_request_spec.rb +4 -6
- data/spec/messages/statistics/table_statistics_spec.rb +4 -6
- data/spec/messages/statistics/vendor_statistics_spec.rb +4 -6
- data/spec/messages/statistics_reply_spec.rb +62 -64
- data/spec/messages/statistics_request_spec.rb +45 -47
- data/spec/messages/vendor_spec.rb +13 -15
- data/spec/spec_helper.rb +1 -1
- data/spec/structs/match_spec.rb +7 -9
- data/spec/structs/packet_queue_spec.rb +5 -7
- data/spec/structs/physical_port_spec.rb +16 -18
- data/spec/structs/port_number_spec.rb +11 -13
- data/spec/structs/queue_properties/queue_properties_spec.rb +5 -7
- data/spec/structs/queue_properties/queue_property_min_rate_spec.rb +5 -7
- data/spec/structs/queue_properties/queue_property_none_spec.rb +3 -5
- metadata +78 -64
- data/lib/actions/action.rb +0 -26
- data/lib/actions/action_enqueue.rb +0 -12
- data/lib/actions/action_output.rb +0 -10
- data/lib/actions/action_set_destination_port.rb +0 -3
- data/lib/actions/action_set_ip_destination.rb +0 -3
- data/lib/actions/action_set_ip_source.rb +0 -9
- data/lib/actions/action_set_ip_tos.rb +0 -11
- data/lib/actions/action_set_mac_destination.rb +0 -3
- data/lib/actions/action_set_mac_source.rb +0 -11
- data/lib/actions/action_set_source_port.rb +0 -11
- data/lib/actions/action_set_vlan_id.rb +0 -11
- data/lib/actions/action_set_vlan_pcp.rb +0 -11
- data/lib/actions/action_strip_vlan.rb +0 -10
- data/lib/actions/action_vendor.rb +0 -9
- data/lib/actions/actions.rb +0 -5
- data/lib/helpers/array_of_subclasses.rb +0 -38
- data/lib/helpers/superclass_base.rb +0 -24
- data/lib/messages/barrier_reply.rb +0 -3
- data/lib/messages/barrier_request.rb +0 -3
- data/lib/messages/echo_reply.rb +0 -9
- data/lib/messages/echo_request.rb +0 -9
- data/lib/messages/error.rb +0 -61
- data/lib/messages/features_reply.rb +0 -40
- data/lib/messages/features_request.rb +0 -3
- data/lib/messages/flow_mod.rb +0 -20
- data/lib/messages/flow_removed.rb +0 -23
- data/lib/messages/get_config_reply.rb +0 -12
- data/lib/messages/get_config_request.rb +0 -3
- data/lib/messages/hello.rb +0 -3
- data/lib/messages/message.rb +0 -45
- data/lib/messages/packet_in.rb +0 -23
- data/lib/messages/packet_out.rb +0 -13
- data/lib/messages/parser.rb +0 -22
- data/lib/messages/port_mod.rb +0 -15
- data/lib/messages/port_status.rb +0 -14
- data/lib/messages/queue_get_config_reply.rb +0 -14
- data/lib/messages/queue_get_config_request.rb +0 -11
- data/lib/messages/set_config.rb +0 -3
- data/lib/messages/statistics.rb +0 -24
- data/lib/messages/statistics/aggregate_statistics_reply.rb +0 -10
- data/lib/messages/statistics/aggregate_statistics_request.rb +0 -3
- data/lib/messages/statistics/description_statistics.rb +0 -28
- data/lib/messages/statistics/flow_statistics_reply.rb +0 -21
- data/lib/messages/statistics/flow_statistics_request.rb +0 -10
- data/lib/messages/statistics/port_statistics_reply.rb +0 -20
- data/lib/messages/statistics/port_statistics_request.rb +0 -8
- data/lib/messages/statistics/queue_statistics_reply.rb +0 -12
- data/lib/messages/statistics/queue_statistics_request.rb +0 -9
- data/lib/messages/statistics/table_statistics.rb +0 -16
- data/lib/messages/statistics/vendor_statistics.rb +0 -7
- data/lib/messages/statistics_reply.rb +0 -22
- data/lib/messages/statistics_request.rb +0 -14
- data/lib/messages/vendor.rb +0 -10
- data/lib/structs/match.rb +0 -102
- data/lib/structs/packet_queue.rb +0 -10
- data/lib/structs/physical_port.rb +0 -46
- data/lib/structs/port_number.rb +0 -45
- data/lib/structs/queue_properties/queue_properties.rb +0 -5
- data/lib/structs/queue_properties/queue_property.rb +0 -16
- data/lib/structs/queue_properties/queue_property_min_rate.rb +0 -26
- 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,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,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,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
|