rubybvc 0.3.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/controller/controller.rb +189 -3
- data/lib/controller/netconf_node.rb +27 -3
- data/lib/controller/node.rb +7 -0
- data/lib/controller/openflow_node.rb +3 -1
- data/lib/netconfdev/vrouter/firewall.rb +6 -1
- data/lib/netconfdev/vrouter/rule.rb +16 -3
- data/lib/netconfdev/vrouter/rules.rb +18 -2
- data/lib/netconfdev/vrouter/vrouter5600.rb +123 -16
- data/lib/openflowdev/action_output.rb +37 -3
- data/lib/openflowdev/actions/action.rb +1 -0
- data/lib/openflowdev/actions/copy_ttl_inwards_action.rb +4 -0
- data/lib/openflowdev/actions/copy_ttl_outwards_action.rb +4 -0
- data/lib/openflowdev/actions/dec_mpls_ttl_action.rb +4 -0
- data/lib/openflowdev/actions/dec_nw_ttl_action.rb +4 -0
- data/lib/openflowdev/actions/drop_action.rb +1 -0
- data/lib/openflowdev/actions/flood_action.rb +4 -0
- data/lib/openflowdev/actions/flood_all_action.rb +4 -0
- data/lib/openflowdev/actions/group_action.rb +7 -1
- data/lib/openflowdev/actions/hw_path_action.rb +3 -0
- data/lib/openflowdev/actions/loopback_action.rb +5 -1
- data/lib/openflowdev/actions/output_action.rb +10 -1
- data/lib/openflowdev/actions/pop_mpls_header_action.rb +6 -1
- data/lib/openflowdev/actions/pop_pbb_header_action.rb +5 -1
- data/lib/openflowdev/actions/pop_vlan_header_action.rb +5 -1
- data/lib/openflowdev/actions/push_mpls_header_action.rb +6 -1
- data/lib/openflowdev/actions/push_pbb_header_action.rb +6 -1
- data/lib/openflowdev/actions/push_vlan_header_action.rb +11 -1
- data/lib/openflowdev/actions/set_dl_dst_action.rb +6 -1
- data/lib/openflowdev/actions/set_dl_src_action.rb +6 -1
- data/lib/openflowdev/actions/set_field_action.rb +7 -1
- data/lib/openflowdev/actions/set_mpls_ttl_action.rb +6 -1
- data/lib/openflowdev/actions/set_nw_dst_action.rb +6 -1
- data/lib/openflowdev/actions/set_nw_src_action.rb +6 -1
- data/lib/openflowdev/actions/set_nw_ttl_action.rb +6 -1
- data/lib/openflowdev/actions/set_queue_action.rb +7 -1
- data/lib/openflowdev/actions/set_tp_dst_action.rb +6 -1
- data/lib/openflowdev/actions/set_tp_src_action.rb +6 -1
- data/lib/openflowdev/actions/set_vlan_cfi_action.rb +6 -1
- data/lib/openflowdev/actions/set_vlan_id_action.rb +6 -1
- data/lib/openflowdev/actions/set_vlan_pcp_action.rb +6 -1
- data/lib/openflowdev/actions/strip_vlan_action.rb +2 -1
- data/lib/openflowdev/actions/sw_path_action.rb +5 -1
- data/lib/openflowdev/flow_entry.rb +86 -6
- data/lib/openflowdev/instruction.rb +12 -1
- data/lib/openflowdev/match.rb +119 -9
- data/lib/openflowdev/of_switch.rb +94 -3
- data/lib/utils/hash_with_compact.rb +1 -1
- data/lib/utils/netconf_response.rb +9 -1
- data/lib/utils/netconf_response_status.rb +1 -0
- data/lib/utils/rest_agent.rb +1 -1
- data/lib/utils/utilities.rb +2 -2
- metadata +2 -2
@@ -28,14 +28,20 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class to define OpenFlow action to set a field.
|
31
32
|
class SetFieldAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +vlan_id+:: integer : VLAN identifier to set.
|
37
|
+
# * +mpls_label+:: integer : MPLS label to set.
|
32
38
|
def initialize(order: 0, vlan_id: nil, mpls_label: nil)
|
33
39
|
super(order: order)
|
34
40
|
@vlan_id = vlan_id
|
35
41
|
@mpls_label = mpls_label
|
36
42
|
end
|
37
43
|
|
38
|
-
def to_hash
|
44
|
+
def to_hash #:nodoc:
|
39
45
|
{:order => @order, 'set-field' => {'vlan-match' => {'vlan-id' =>
|
40
46
|
{'vlan-id' => @vlan_id, 'vlan-id-present' => !@vlan_id.nil?}},
|
41
47
|
'protocol-match-fields' => {'mpls-label' => @mpls_label}}}
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class to define an OpenFlow action to set the MPLS Time To Live (TTL)
|
31
32
|
class SetMplsTTLAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +mpls_ttl+:: integer : The Time To Live to set in the MPLS header.
|
32
37
|
def initialize(order: 0, mpls_ttl: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "MPLS TTL (mpls_ttl) required" unless mpls_ttl
|
35
40
|
@mpls_ttl = mpls_ttl
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => order, 'set-mpls-ttl-action' => {'mpls-ttl' => @mpls_ttl}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class to define OpenFlow action to set the destination IP (network layer) address
|
31
32
|
class SetNwDstAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +ip_addr+:: string : The destination IP address to set.
|
32
37
|
def initialize(order: nil, ip_addr: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "IP Address (ip_addr) required" unless ip_addr
|
35
40
|
@ip = ip_addr
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-nw-dst-action' => {:address => @ip}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action for setting the Source IP address (network layer)
|
31
32
|
class SetNwSrcAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +ip_addr+:: string : The IP address to set in source IP
|
32
37
|
def initialize(order: nil, ip_addr: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "IP Address (ip_addr) required" unless ip_addr
|
35
40
|
@ip = ip_addr
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-nw-src-action' => {:address => @ip}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to set IP header Time To Live (network layer)
|
31
32
|
class SetNwTTLAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +ip_ttl+:: integer : The Time To Live to set in the IP header.
|
32
37
|
def initialize(order: 0, ip_ttl: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "IP TTL (ip_ttl) required" unless ip_ttl
|
35
40
|
@ip_ttl = ip_ttl
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-nw-ttl-action' => {'nw-ttl' => @ip_ttl}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,7 +28,13 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class to define OpenFlow action to set the queue for the packet
|
31
32
|
class SetQueueAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +queue+::
|
37
|
+
# * +queue_id+:: integer : ID of the queue onto which the packet is to be queued.
|
32
38
|
def initialize(order: nil, queue: nil, queue_id: nil)
|
33
39
|
super(order: order)
|
34
40
|
raise ArgumentError, "Queue (queue) required" unless queue
|
@@ -37,7 +43,7 @@ class SetQueueAction < Action
|
|
37
43
|
@queue_id = queue
|
38
44
|
end
|
39
45
|
|
40
|
-
def to_hash
|
46
|
+
def to_hash #:nodoc:
|
41
47
|
{:order => @order, 'queue-action' => {:queue => @queue,
|
42
48
|
'queue-id' => @queue_id}}
|
43
49
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to set the TCP Destination port
|
31
32
|
class SetTpDstAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +port+:: integer : The destination TCP port to set.
|
32
37
|
def initialize(order: nil, port: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "Port (port) required" unless port
|
35
40
|
@port = port
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => order, 'set-tp-dst-action' => {:port => @port}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to set TCP Source Port
|
31
32
|
class SetTpSrcAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +port+:: integer : The port number to set for TCP source port.
|
32
37
|
def initialize(order: nil, port: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "Port (port) required" unless port
|
35
40
|
@port = port
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => order, 'set-tp-src-action' => {:port => @port}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to set the CFI field of VLAN header
|
31
32
|
class SetVlanCfiAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +vlan_cfi+:: integer : The CFI field value to set.
|
32
37
|
def initialize(order: nil, vlan_cfi: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "VLAN CFI (vlan_cfi) required" unless vlan_cfi
|
35
40
|
@vlan_cfi = vlan_cfi
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-vlan-cfi-action' => {'vlan-cfi' => @vlan_cfi}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class to define OpenFlow action that will set the VLAN identifier in VLAN header
|
31
32
|
class SetVlanIdAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +vlan_id+:: integer : The VLAN identifier to set in VLAN header.
|
32
37
|
def initialize(order: nil, vlan_id: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "VLAN ID (vlan_id) required" unless vlan_id
|
35
40
|
@vlan_id = vlan_id
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-vlan-id-action' => {'vlan-id' => @vlan_id}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,14 +28,19 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to set the PCP field in VLAN header
|
31
32
|
class SetVlanPCPAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
36
|
+
# * +vlan_pcp+:: integer : The valoue to set in the PCP field in VLAN header.
|
32
37
|
def initialize(order: nil, vlan_pcp: nil)
|
33
38
|
super(order: order)
|
34
39
|
raise ArgumentError, "VLAN PCP (vlan_pcp) required" unless vlan_pcp
|
35
40
|
@vlan_pcp = vlan_pcp
|
36
41
|
end
|
37
42
|
|
38
|
-
def to_hash
|
43
|
+
def to_hash #:nodoc:
|
39
44
|
{:order => @order, 'set-vlan-pcp-action' => {'vlan-pcp' => @vlan_pcp}}
|
40
45
|
end
|
41
46
|
end
|
@@ -28,8 +28,9 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
#Class used to define OpenFlow action to strip the VLAN header.
|
31
32
|
class StripVlanAction < Action
|
32
|
-
def to_hash
|
33
|
+
def to_hash #:nodoc:
|
33
34
|
{:order => @order, 'strip-vlan-action' => {}}
|
34
35
|
end
|
35
36
|
end
|
@@ -28,12 +28,16 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
|
31
32
|
class SwPathAction < Action
|
33
|
+
|
34
|
+
# _Parameters_
|
35
|
+
# * +order+:: integer : The order of the action relative to other actions in Instruction.
|
32
36
|
def initialize(order: 0)
|
33
37
|
super(order: order)
|
34
38
|
end
|
35
39
|
|
36
|
-
def to_hash
|
40
|
+
def to_hash #:nodoc:
|
37
41
|
{:order => @order, 'sw-path-action' => {}}
|
38
42
|
end
|
39
43
|
end
|
@@ -28,14 +28,84 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
# Class for creating and interacting with OpenFlow flows
|
31
32
|
class FlowEntry
|
32
33
|
require 'openflowdev/instruction'
|
33
34
|
require 'openflowdev/match'
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
# string: ID of the table to put the flow in
|
37
|
+
attr_reader :table_id
|
38
|
+
# integer: Unique identifier of this FlowEntry in the Controller's data store
|
39
|
+
attr_reader :id
|
40
|
+
# integer: Priority level of flow entry
|
41
|
+
attr_reader :priority
|
42
|
+
# integer: Idle time before discarding (seconds)
|
43
|
+
attr_reader :idle_timeout
|
44
|
+
# integer: Max time before discarding (seconds)
|
45
|
+
attr_reader :hard_timeout
|
46
|
+
# boolean: Modify/Delete entry strictly matching wildcards and priority
|
47
|
+
attr_reader :strict
|
48
|
+
# internal Controller's inventory attribute
|
49
|
+
attr_reader :install_hw
|
50
|
+
# boolean: Boolean flag used to enforce OpenFlow switch to do ordered message processing.
|
51
|
+
# Barrier request/reply messages are used by the controller to ensure message dependencies
|
52
|
+
# have been met or to receive notifications for completed operations. When the controller
|
53
|
+
# wants to ensure message dependencies have been met or wants to receive notifications for
|
54
|
+
# completed operations, it may use an OFPT_BARRIER_REQUEST message. This message has no body.
|
55
|
+
# Upon receipt, the switch must finish processing all previously-received messages, including
|
56
|
+
# sending corresponding reply or error messages, before executing any messages beyond the
|
57
|
+
# Barrier Request.
|
58
|
+
attr_reader :barrier
|
59
|
+
# integer: Opaque Controller-issued identifier
|
60
|
+
attr_reader :cookie
|
61
|
+
# integer: Mask used to restrict the cookie bits that must match when the command is
|
62
|
+
# OFPFC_MODIFY* or OFPFC_DELETE*. A value of 0 indicates no restriction
|
63
|
+
attr_reader :cookie_mask
|
64
|
+
# string: FlowEntry name in the FlowTable (internal Controller's inventory attribute)
|
65
|
+
attr_reader :name
|
66
|
+
# list of Instruction: Instructions to be executed when a flow matches this entry flow match fields
|
67
|
+
attr_reader :instructions
|
68
|
+
# Match: Flow match fields
|
69
|
+
attr_reader :match
|
70
|
+
# integer: For delete commands, require matching entries to include this as an
|
71
|
+
# output port. A value of OFPP_ANY indicates no restriction.
|
72
|
+
attr_reader :out_port
|
73
|
+
# integer: For delete commands, require matching entries to include this as an
|
74
|
+
# output group. A value of OFPG_ANY indicates no restriction
|
75
|
+
attr_reader :out_group
|
76
|
+
# integer: Bitmap of OpenFlow flags (OFPFF_* from OpenFlow spec)
|
77
|
+
attr_reader :flags
|
78
|
+
# Buffered packet to apply to, or OFP_NO_BUFFER. Not meaningful for delete
|
79
|
+
attr_reader :buffer_id
|
80
|
+
|
81
|
+
# _Parameters_
|
82
|
+
# * +flow_table_id+:: string: ID of the table to put the flow in
|
83
|
+
# * +flow_id+:: integer: Unique identifier of this FlowEntry in the Controller's data store
|
84
|
+
# * +flow_priority+:: integer: Priority level of flow entry
|
85
|
+
# * +name+:: string: FlowEntry name in the FlowTable (internal Controller's inventory attribute)
|
86
|
+
# * +idle_timeout+:: integer: Idle time before discarding (seconds)
|
87
|
+
# * +hard_timeout+:: integer: Max time before discarding (seconds)
|
88
|
+
# * +strict+:: boolean: Modify/Delete entry strictly matching wildcards and priority
|
89
|
+
# * +install_hw+:: internal Controller's inventory attribute
|
90
|
+
# * +barrier+:: boolean: Boolean flag used to enforce OpenFlow switch to do ordered message processing.
|
91
|
+
# Barrier request/reply messages are used by the controller to ensure message dependencies
|
92
|
+
# have been met or to receive notifications for completed operations. When the controller
|
93
|
+
# wants to ensure message dependencies have been met or wants to receive notifications for
|
94
|
+
# completed operations, it may use an OFPT_BARRIER_REQUEST message. This message has no body.
|
95
|
+
# Upon receipt, the switch must finish processing all previously-received messages, including
|
96
|
+
# sending corresponding reply or error messages, before executing any messages beyond the
|
97
|
+
# Barrier Request.
|
98
|
+
# * +cookie+:: integer: Opaque Controller-issued identifier
|
99
|
+
# * +cookie_mask+:: integer: Mask used to restrict the cookie bits that must match when the command is
|
100
|
+
# OFPFC_MODIFY* or OFPFC_DELETE*. A value of 0 indicates no restriction
|
101
|
+
# * +out_port+:: integer: For delete commands, require matching entries to include this as an
|
102
|
+
# output port. A value of OFPP_ANY indicates no restriction.
|
103
|
+
# * +out_group+:: integer: For delete commands, require matching entries to include this as an
|
104
|
+
# output group. A value of OFPG_ANY indicates no restriction
|
105
|
+
# * +flags+:: integer: Bitmap of OpenFlow flags (OFPFF_* from OpenFlow spec)
|
106
|
+
# * +buffer_id+:: Buffered packet to apply to, or OFP_NO_BUFFER. Not meaningful for delete
|
107
|
+
|
108
|
+
|
39
109
|
def initialize(flow_table_id: 0, flow_id: nil, flow_priority: nil, name: nil,
|
40
110
|
idle_timeout: 0, hard_timeout: 0, strict: false, install_hw: false,
|
41
111
|
barrier: false, cookie: nil, cookie_mask: nil, out_port: nil,
|
@@ -61,17 +131,27 @@ class FlowEntry
|
|
61
131
|
@buffer_id = buffer_id
|
62
132
|
end
|
63
133
|
|
134
|
+
##
|
135
|
+
# Add an Instruction to the flow entry.
|
136
|
+
#
|
137
|
+
# _Parameters_
|
138
|
+
# * +instruction+:: Instruction : Instruction to add to the flow entry.
|
64
139
|
def add_instruction(instruction)
|
65
140
|
raise ArgumentError, "Instruction must be of type 'Instruction'" unless instruction.is_a?(Instruction)
|
66
141
|
@instructions << instruction
|
67
142
|
end
|
68
|
-
|
143
|
+
|
144
|
+
##
|
145
|
+
# Add a match rule to the flow entry.
|
146
|
+
#
|
147
|
+
# _Parameters_
|
148
|
+
# * +match+:: Match : Match to add to the flow entry.
|
69
149
|
def add_match(match)
|
70
150
|
raise ArgumentError, "Match must be of type 'Match'" unless match.is_a?(Match)
|
71
151
|
@match = match
|
72
152
|
end
|
73
153
|
|
74
|
-
def to_hash
|
154
|
+
def to_hash #:nodoc:
|
75
155
|
instructions_hash = []
|
76
156
|
@instructions.each do |instruction|
|
77
157
|
instructions_hash << instruction.to_hash
|
@@ -28,22 +28,33 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
# Class representing OpenFlow flow instruction
|
31
32
|
class Instruction
|
33
|
+
# integer : order that action is to be carried out relative to other instructions.
|
32
34
|
attr_accessor :order
|
35
|
+
# Action : list of Action
|
33
36
|
attr_reader :actions
|
34
37
|
|
38
|
+
##
|
39
|
+
# _Parameters_
|
40
|
+
# * +instruction_order+:: Order in which to carry out this instruction relative to other instructions.
|
35
41
|
def initialize(instruction_order: nil)
|
36
42
|
raise ArgumentError, "Instruction Order (instruction_order) required" unless instruction_order
|
37
43
|
@order = instruction_order
|
38
44
|
@actions = []
|
39
45
|
end
|
40
46
|
|
47
|
+
##
|
48
|
+
# Add action to an Instruction.
|
49
|
+
#
|
50
|
+
# _Parameters_
|
51
|
+
# * +action+:: Action : What action to take
|
41
52
|
def add_apply_action(action)
|
42
53
|
raise ArgumentError, "Action must be a subclass of 'Action'" unless action.is_a?(Action)
|
43
54
|
@actions << action
|
44
55
|
end
|
45
56
|
|
46
|
-
def to_hash
|
57
|
+
def to_hash #:nodoc:
|
47
58
|
actions_hash = []
|
48
59
|
@actions.each do |action|
|
49
60
|
actions_hash << action.to_hash
|
data/lib/openflowdev/match.rb
CHANGED
@@ -28,16 +28,126 @@
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
29
29
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
30
30
|
|
31
|
+
# Class that represents OpenFlow flow matching attributes
|
31
32
|
class Match
|
32
33
|
require 'utils/hash_with_compact'
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
|
35
|
+
# integer : Ethernet type
|
36
|
+
attr_reader :eth_type
|
37
|
+
# string : IPv4 Destination IP address
|
38
|
+
attr_reader :ipv4_dst
|
39
|
+
# string : IPv4 Source IP address
|
40
|
+
attr_reader :ipv4_src
|
41
|
+
# string : IPv6 Source IP address
|
42
|
+
attr_reader :ipv6_src
|
43
|
+
# string : IPv6 Destination IP address
|
44
|
+
attr_reader :ipv6_dst
|
45
|
+
# string : IPv6 Flow Label
|
46
|
+
attr_reader :ipv6_flabel
|
47
|
+
# integer : IPv6 Extension header
|
48
|
+
attr_reader :ipv6_ext_hdr
|
49
|
+
# string : Ethernet Destination address e.g. "00:11:22:33:44:55"
|
50
|
+
attr_reader :ethernet_dst
|
51
|
+
# string : Ethernet Source address e.g. "00:11:22:33:44:55"
|
52
|
+
attr_reader :ethernet_src
|
53
|
+
# integer : Input physical port - not used for matches
|
54
|
+
attr_reader :in_phy_port
|
55
|
+
# integer : Input port
|
56
|
+
attr_reader :in_port
|
57
|
+
# integer : Ip protocol
|
58
|
+
attr_reader :ip_proto
|
59
|
+
# integer : Differentiated Services Code Point
|
60
|
+
attr_reader :ip_dscp
|
61
|
+
# integer : Explicit Congestion Notificaiton
|
62
|
+
attr_reader :ip_ecn
|
63
|
+
# integer : TCP Source port number
|
64
|
+
attr_reader :tcp_src_port
|
65
|
+
# integer : TCP Destination port number
|
66
|
+
attr_reader :tcp_dst_port
|
67
|
+
# integer : UDP Source port number
|
68
|
+
attr_reader :udp_src_port
|
69
|
+
# integer : UDP Destination port number
|
70
|
+
attr_reader :udp_dst_port
|
71
|
+
# integer : ICMPv4 type
|
72
|
+
attr_reader :icmpv4_type
|
73
|
+
# integer : ICMPv4 code
|
74
|
+
attr_reader :icmpv4_code
|
75
|
+
# integer : ICMPv6 type
|
76
|
+
attr_reader :icmpv6_type
|
77
|
+
# integer : ICMPv6 code
|
78
|
+
attr_reader :icmpv6_code
|
79
|
+
# integer : ARP opcode
|
80
|
+
attr_reader :arp_op_code
|
81
|
+
# string : ARP source IPv4 address. e.g. "111.222.333.444"
|
82
|
+
attr_reader :arp_src_ipv4
|
83
|
+
# string : ARP target IPv4 address. e.g. "111.222.333.444"
|
84
|
+
attr_reader :arp_tgt_ipv4
|
85
|
+
# string : ARP source hardware address. e.g. "111.222.333.444"
|
86
|
+
attr_reader :arp_src_hw_addr
|
87
|
+
# string : ARP target hardware address. e.g. "111.222.333.444"
|
88
|
+
attr_reader :arp_tgt_hw_addr
|
89
|
+
# integer: VLAN identifier
|
90
|
+
attr_reader :vlan_id
|
91
|
+
# integer: VLAN priority code point
|
92
|
+
attr_reader :vlan_pcp
|
93
|
+
# integer : Stream control transmission protocol destination port
|
94
|
+
attr_reader :sctp_dst
|
95
|
+
# integer : Stream control transmission protocol source port
|
96
|
+
attr_reader :sctp_src
|
97
|
+
# integer : Multiprotocol Label Switching label
|
98
|
+
attr_reader :mpls_label
|
99
|
+
# integer : Multiprotocol Label Switching traffic class
|
100
|
+
attr_reader :mpls_tc
|
101
|
+
# integer : Multiprotocol Label Switching bottom of stack flag
|
102
|
+
attr_reader :mpls_bos
|
103
|
+
# integer : tunnel identifier
|
104
|
+
attr_reader :tunnel_id
|
105
|
+
# integer : Openflow intra-table metadata
|
106
|
+
attr_reader :metadata
|
107
|
+
# integer : Openflow intra-table metadata mask
|
108
|
+
attr_reader :metadata_mask
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
# _Parameters_
|
113
|
+
# * +eth_type+:: integer : Ethernet type
|
114
|
+
# * +ipv4_destination+:: string : IPv4 Destination IP address
|
115
|
+
# * +ipv4_source+:: string : IPv4 Source IP address
|
116
|
+
# * +ipv6_source+:: string : IPv6 Source IP address
|
117
|
+
# * +ipv6_destination+:: string : IPv6 Destination IP address
|
118
|
+
# * +ipv6_flabel+:: string : IPv6 Flow Label
|
119
|
+
# * +ipv6_ext_header+:: integer : IPv6 Extension header
|
120
|
+
# * +ethernet_destination+:: string : Ethernet Destination address e.g. "00:11:22:33:44:55"
|
121
|
+
# * +ethernet_source+:: string : Ethernet Source address e.g. "00:11:22:33:44:55"
|
122
|
+
# * +in_physical_port+:: integer : Input physical port - not used for matches
|
123
|
+
# * +in_port+:: integer : Input port
|
124
|
+
# * +ip_protocol_num+:: integer : Ip protocol
|
125
|
+
# * +ip_dscp+:: integer : Differentiated Services Code Point
|
126
|
+
# * +ip_ecn+:: integer : Explicit Congestion Notificaiton
|
127
|
+
# * +tcp_source_port+:: integer : TCP Source port number
|
128
|
+
# * +tcp_destination_port+:: integer : TCP Destination port number
|
129
|
+
# * +udp_source_port+:: integer : UDP Source port number
|
130
|
+
# * +udp_destination_port+:: integer : UDP Destination port number
|
131
|
+
# * +icmpv4_type+:: integer : ICMPv4 type
|
132
|
+
# * +icmpv4_code+:: integer : ICMPv4 code
|
133
|
+
# * +icmpv6_type+:: integer : ICMPv6 type
|
134
|
+
# * +icmpv6_code+:: integer : ICMPv6 code
|
135
|
+
# * +arp_op_code+:: integer : ARP opcode
|
136
|
+
# * +arp_source_ipv4+:: string : ARP source IPv4 address. e.g. "111.222.333.444"
|
137
|
+
# * +arp_target_ipv4+:: string : ARP target IPv4 address. e.g. "111.222.333.444"
|
138
|
+
# * +arp_source_hardware_address+:: string : ARP source hardware address. e.g. "111.222.333.444"
|
139
|
+
# * +arp_target_hardware_address+:: string : ARP target hardware address. e.g. "111.222.333.444"
|
140
|
+
# * +vlan_id+:: integer: VLAN identifier
|
141
|
+
# * +vlan_pcp+:: integer: VLAN priority code point
|
142
|
+
# * +sctp_destination+:: integer : Stream control transmission protocol destination port
|
143
|
+
# * +sctp_source+:: integer : Stream control transmission protocol source port
|
144
|
+
# * +mpls_label+:: integer : Multiprotocol Label Switching label
|
145
|
+
# * +mpls_tc+:: integer : Multiprotocol Label Switching traffic class
|
146
|
+
# * +mpls_bos+:: integer : Multiprotocol Label Switching bottom of stack flag
|
147
|
+
# * +tunnel_id+:: integer : tunnel identifier
|
148
|
+
# * +metadata+:: integer : Openflow intra-table metadata
|
149
|
+
# * +metadata_mask+:: integer : Openflow intra-table metadata mask
|
150
|
+
|
41
151
|
def initialize(eth_type: nil, ipv4_destination: nil, ipv4_source: nil,
|
42
152
|
ipv6_source: nil, ipv6_destination: nil, ipv6_flabel: nil,
|
43
153
|
ipv6_ext_header: nil, ethernet_destination: nil, ethernet_source: nil,
|
@@ -89,7 +199,7 @@ class Match
|
|
89
199
|
@metadata_mask = metadata_mask
|
90
200
|
end
|
91
201
|
|
92
|
-
def to_hash
|
202
|
+
def to_hash #:nodoc:
|
93
203
|
hash = {'ethernet-match' => {'ethernet-type' => {:type => @eth_type},
|
94
204
|
'ethernet-destination' => {:address => @ethernet_dst},
|
95
205
|
'ethernet-source' => {:address => @ethernet_src}},
|