trema 0.2.2.1 → 0.2.3
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.
- data/.gitmodules +3 -0
- data/.travis.yml +13 -0
- data/.yardopts +4 -0
- data/Gemfile +2 -3
- data/README.md +43 -97
- data/Rakefile +60 -4
- data/Rantfile +11 -10
- data/cruise.rb +4 -6
- data/features/example.packetin_filter_config.feature +10 -10
- data/features/example.switch_monitor.feature +14 -2
- data/features/step_definitions/kill_steps.rb +2 -2
- data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
- data/features/step_definitions/misc_steps.rb +1 -1
- data/features/step_definitions/up_steps.rb +30 -0
- data/features/trema.feature +1 -0
- data/features/trema.run.feature +1 -0
- data/locale/README.ja.md +19 -0
- data/locale/ja/yard.po +3762 -0
- data/locale/yard.pot +3740 -0
- data/ruby/extconf.rb +4 -1
- data/ruby/trema/action-common.c +3 -17
- data/ruby/trema/action-common.h +3 -7
- data/ruby/trema/action.rb +33 -0
- data/ruby/trema/app.rb +1 -1
- data/ruby/trema/barrier-request.c +1 -0
- data/ruby/trema/command/run.rb +13 -9
- data/ruby/trema/command/usage.rb +1 -0
- data/ruby/trema/command/version.rb +1 -1
- data/ruby/trema/controller.c +133 -50
- data/ruby/trema/controller.rb +2 -2
- data/ruby/trema/desc-stats-reply.rb +77 -0
- data/ruby/trema/dsl/configuration.rb +3 -14
- data/ruby/trema/dsl/rswitch.rb +47 -0
- data/ruby/trema/dsl/runner.rb +4 -1
- data/ruby/trema/dsl/syntax.rb +11 -8
- data/ruby/trema/echo-reply.c +59 -45
- data/ruby/trema/echo-reply.h +1 -3
- data/ruby/trema/echo-request.c +49 -71
- data/ruby/trema/echo-request.h +0 -2
- data/ruby/trema/echo.c +99 -0
- data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
- data/ruby/trema/enqueue.rb +87 -0
- data/ruby/trema/error.c +109 -104
- data/ruby/trema/error.h +0 -2
- data/ruby/trema/features-reply.c +89 -35
- data/ruby/trema/features-reply.h +0 -6
- data/ruby/trema/features-request.c +63 -37
- data/ruby/trema/features-request.h +0 -2
- data/ruby/trema/flow-mod.c +149 -0
- data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
- data/ruby/trema/get-config-request.c +1 -0
- data/ruby/trema/hardware-switch.rb +88 -0
- data/ruby/trema/hello.c +55 -31
- data/ruby/trema/hello.h +0 -2
- data/ruby/trema/ip.rb +12 -2
- data/ruby/trema/logger.rb +29 -0
- data/ruby/trema/mac.rb +57 -36
- data/ruby/trema/match.c +7 -9
- data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
- data/ruby/trema/network-component.rb +1 -1
- data/ruby/trema/open-vswitch.rb +2 -2
- data/ruby/trema/openflow-switch.rb +3 -54
- data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
- data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
- data/ruby/trema/packet-queue.rb +4 -3
- data/ruby/trema/port-mod.c +8 -9
- data/ruby/trema/port-status-add.rb +60 -0
- data/ruby/trema/port-status-delete.rb +60 -0
- data/ruby/trema/port-status-modify.rb +60 -0
- data/ruby/trema/port-status.c +48 -15
- data/ruby/trema/port-status.h +6 -8
- data/ruby/trema/port.c +63 -8
- data/ruby/trema/queue-get-config-request.c +1 -0
- data/ruby/trema/ruby-switch.rb +62 -0
- data/ruby/trema/send-out-port.rb +97 -0
- data/ruby/trema/set-config.c +1 -0
- data/ruby/trema/set-eth-addr.rb +45 -0
- data/ruby/trema/set-eth-dst-addr.rb +54 -0
- data/ruby/trema/set-eth-src-addr.rb +54 -0
- data/ruby/trema/set-ip-addr.rb +47 -0
- data/ruby/trema/set-ip-dst-addr.rb +53 -0
- data/ruby/trema/set-ip-src-addr.rb +52 -0
- data/ruby/trema/set-ip-tos.rb +63 -0
- data/ruby/trema/set-transport-dst-port.rb +53 -0
- data/ruby/trema/set-transport-port.rb +52 -0
- data/ruby/trema/set-transport-src-port.rb +54 -0
- data/ruby/trema/set-vlan-priority.rb +65 -0
- data/ruby/trema/set-vlan-vid.rb +64 -0
- data/ruby/trema/shell/down.rb +1 -1
- data/ruby/trema/shell/link.rb +4 -4
- data/ruby/trema/shell/run.rb +8 -6
- data/ruby/trema/shell/up.rb +3 -3
- data/ruby/trema/stats-reply.c +27 -2
- data/ruby/trema/stats-request.c +64 -23
- data/ruby/trema/strip-vlan-header.rb +41 -0
- data/ruby/trema/switch.c +196 -0
- data/ruby/trema/{action-vendor.h → switch.h} +5 -7
- data/ruby/trema/switch.rb +28 -9
- data/ruby/trema/trema-ruby-utils.c +66 -0
- data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
- data/ruby/trema/trema.c +61 -61
- data/ruby/trema/vendor-action.rb +73 -0
- data/ruby/trema/vendor.c +121 -52
- data/ruby/trema/vendor.h +6 -10
- data/ruby/trema/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/action.rb +52 -0
- data/spec/support/mandatory-option.rb +56 -0
- data/spec/support/openflow-message.rb +91 -7
- data/spec/support/port-status.rb +38 -0
- data/spec/trema/controller_spec.rb +0 -26
- data/spec/trema/dsl/configuration_spec.rb +3 -3
- data/spec/trema/dsl/runner_spec.rb +12 -32
- data/spec/trema/dsl/syntax_spec.rb +2 -11
- data/spec/trema/echo-reply_spec.rb +49 -14
- data/spec/trema/echo-request_spec.rb +86 -34
- data/spec/trema/enqueue_spec.rb +76 -0
- data/spec/trema/error_spec.rb +43 -58
- data/spec/trema/features-reply_spec.rb +58 -24
- data/spec/trema/features-request_spec.rb +54 -28
- data/spec/trema/flow-mod_spec.rb +99 -0
- data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
- data/spec/trema/hello_spec.rb +28 -14
- data/spec/trema/ip_spec.rb +54 -0
- data/spec/trema/mac_spec.rb +49 -64
- data/spec/trema/match_spec.rb +1 -1
- data/spec/trema/open-vswitch_spec.rb +7 -7
- data/spec/trema/packet-in_spec.rb +73 -16
- data/spec/trema/port-status-add_spec.rb +32 -0
- data/spec/trema/port-status-delete_spec.rb +32 -0
- data/spec/trema/port-status-modify_spec.rb +71 -0
- data/spec/trema/port-status_spec.rb +5 -76
- data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
- data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
- data/spec/trema/set-eth-src-addr_spec.rb +72 -0
- data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
- data/spec/trema/set-ip-src-addr_spec.rb +58 -0
- data/spec/trema/set-ip-tos_spec.rb +65 -0
- data/spec/trema/set-transport-dst-port_spec.rb +65 -0
- data/spec/trema/set-transport-src-port_spec.rb +65 -0
- data/spec/trema/set-vlan-priority_spec.rb +65 -0
- data/spec/trema/set-vlan-vid_spec.rb +65 -0
- data/spec/trema/shell/vhost_spec.rb +4 -1
- data/spec/trema/shell/vswitch_spec.rb +11 -11
- data/spec/trema/stats-reply_spec.rb +59 -13
- data/spec/trema/stats-request_spec.rb +6 -0
- data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
- data/spec/trema/switch-daemon_spec.rb +39 -0
- data/spec/trema/vendor-action_spec.rb +81 -0
- data/spec/trema/vendor_spec.rb +76 -0
- data/spec/trema_spec.rb +56 -0
- data/src/examples/dumper/dumper.c +0 -8
- data/src/examples/dumper/dumper.rb +52 -52
- data/src/examples/hello_trema/hello_trema.c +0 -2
- data/src/examples/learning_switch/learning-switch.rb +3 -3
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
- data/src/examples/openflow_message/features-request.rb +3 -3
- data/src/examples/packetin_filter_config/utils.c +4 -4
- data/src/examples/repeater_hub/repeater-hub.rb +3 -3
- data/src/examples/switch_info/switch_info.rb +2 -2
- data/src/examples/switch_monitor/switch_monitor.c +1 -1
- data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
- data/src/lib/arp.h +4 -1
- data/src/lib/chibach.c +391 -0
- data/src/lib/chibach.h +71 -0
- data/src/lib/chibach_private.c +170 -0
- data/src/lib/chibach_private.h +52 -0
- data/src/lib/ether.c +2 -1
- data/src/lib/ether.h +0 -1
- data/src/lib/ipv4.h +13 -14
- data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
- data/src/lib/log.c +161 -58
- data/src/lib/log.h +11 -16
- data/src/lib/messenger.c +36 -1
- data/src/lib/messenger.h +1 -0
- data/src/lib/openflow_application_interface.c +128 -28
- data/src/lib/openflow_application_interface.h +31 -6
- data/src/lib/openflow_message.c +2 -1
- data/src/lib/openflow_service_interface.h +1 -0
- data/src/lib/openflow_switch_interface.c +1380 -0
- data/src/lib/openflow_switch_interface.h +264 -0
- data/src/lib/packet_info.c +94 -11
- data/src/lib/packet_info.h +22 -3
- data/src/lib/packet_parser.c +38 -2
- data/src/lib/secure_channel.c +498 -0
- data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
- data/src/lib/tcp.h +0 -3
- data/src/lib/trema.c +38 -5
- data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
- data/src/lib/trema_wrapper.c +5 -0
- data/src/lib/trema_wrapper.h +4 -0
- data/src/lib/utility.c +93 -4
- data/src/lib/utility.h +1 -0
- data/src/lib/wrapper.c +30 -7
- data/src/lib/wrapper.h +2 -0
- data/src/switch_manager/ofpmsg_recv.c +44 -30
- data/src/switch_manager/ofpmsg_send.c +40 -1
- data/src/switch_manager/ofpmsg_send.h +2 -0
- data/src/switch_manager/switch.c +153 -8
- data/src/switch_manager/switch.h +1 -0
- data/src/switch_manager/switchinfo.h +5 -0
- data/src/tremashark/README +2 -2
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
- data/trema +1 -1
- data/unittests/lib/log_test.c +158 -34
- data/unittests/lib/openflow_application_interface_test.c +252 -69
- data/unittests/lib/openflow_message_test.c +3 -1
- data/unittests/lib/packet_parser_test.c +60 -15
- data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
- data/unittests/lib/trema_test.c +2 -0
- data/unittests/lib/utility_test.c +65 -2
- data/unittests/lib/wrapper_test.c +29 -0
- data/vendor/{README → README.md} +2 -12
- data/vendor/packet-openflow.diff +13 -0
- metadata +86 -53
- data/GPL2 +0 -339
- data/ruby/trema/action-enqueue.c +0 -161
- data/ruby/trema/action-output.c +0 -169
- data/ruby/trema/action-set-dl-dst.c +0 -131
- data/ruby/trema/action-set-dl-dst.h +0 -44
- data/ruby/trema/action-set-dl-src.c +0 -131
- data/ruby/trema/action-set-nw-dst.c +0 -135
- data/ruby/trema/action-set-nw-src.c +0 -140
- data/ruby/trema/action-set-nw-tos.c +0 -124
- data/ruby/trema/action-set-nw-tos.h +0 -42
- data/ruby/trema/action-set-tp-dst.c +0 -122
- data/ruby/trema/action-set-tp-dst.h +0 -42
- data/ruby/trema/action-set-tp-src.c +0 -124
- data/ruby/trema/action-set-tp-src.h +0 -42
- data/ruby/trema/action-set-vlan-pcp.c +0 -128
- data/ruby/trema/action-set-vlan-pcp.h +0 -42
- data/ruby/trema/action-set-vlan-vid.c +0 -125
- data/ruby/trema/action-set-vlan-vid.h +0 -42
- data/ruby/trema/action-strip-vlan.c +0 -81
- data/ruby/trema/action-strip-vlan.h +0 -42
- data/ruby/trema/action-vendor.c +0 -121
- data/ruby/trema/vendor-request.c +0 -193
- data/spec/trema/action-enqueue_spec.rb +0 -100
- data/spec/trema/action-set-dl-dst_spec.rb +0 -95
- data/spec/trema/action-set-dl-src_spec.rb +0 -92
- data/spec/trema/action-set-nw-dst_spec.rb +0 -96
- data/spec/trema/action-set-nw-src_spec.rb +0 -97
- data/spec/trema/action-set-nw-tos_spec.rb +0 -88
- data/spec/trema/action-set-tp-dst_spec.rb +0 -88
- data/spec/trema/action-set-tp-src_spec.rb +0 -88
- data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
- data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
- data/spec/trema/action-vendor_spec.rb +0 -90
- data/spec/trema/vendor-request_spec.rb +0 -79
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
|
3
|
-
#
|
|
4
2
|
# Copyright (C) 2008-2012 NEC Corporation
|
|
5
3
|
#
|
|
6
4
|
# This program is free software; you can redistribute it and/or modify
|
|
@@ -22,69 +20,44 @@ require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
|
22
20
|
require "trema"
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
describe SendOutPort, ".new( 1 )" do
|
|
24
|
+
subject { SendOutPort.new( 1 ) }
|
|
25
|
+
its( :port_number ) { should == 1 }
|
|
26
|
+
its( :max_len ) { should == 2 ** 16 - 1 }
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
describe
|
|
31
|
-
subject {
|
|
32
|
-
|
|
33
|
-
let( :max_len ) { 256 }
|
|
34
|
-
its( :port ) { should == 1 }
|
|
35
|
-
its( :max_len ) { should == 256 }
|
|
36
|
-
it "should inspect its attributes" do
|
|
37
|
-
subject.inspect.should == "#<Trema::ActionOutput port=1,max_len=256>"
|
|
38
|
-
end
|
|
39
|
-
it_should_behave_like "any OpenFlow message with port option"
|
|
40
|
-
it_should_behave_like "any OpenFlow message with max_len option"
|
|
41
|
-
end
|
|
42
|
-
|
|
30
|
+
describe SendOutPort, ".new( :port_number => number )" do
|
|
31
|
+
subject { SendOutPort.new :port_number => port_number }
|
|
32
|
+
it_validates "option range", :port_number, 0..( 2 ** 16 - 1 )
|
|
43
33
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
its( :max_len ) { should == 2**16 -1 }
|
|
48
|
-
it "should inspect its attributes" do
|
|
49
|
-
subject.inspect.should == "#<Trema::ActionOutput port=1,max_len=65535>"
|
|
34
|
+
context "when :port_number == 1" do
|
|
35
|
+
let( :port_number ) { 1 }
|
|
36
|
+
its( :port_number ) { should == 1 }
|
|
50
37
|
end
|
|
51
38
|
end
|
|
52
39
|
|
|
53
40
|
|
|
54
|
-
describe
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
end
|
|
41
|
+
describe SendOutPort, ".new( :port_number => 1, :max_len => number )" do
|
|
42
|
+
subject { SendOutPort.new :port_number => 1, :max_len => max_len }
|
|
43
|
+
it_validates "option range", :max_len, 0..( 2 ** 16 - 1 )
|
|
59
44
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
45
|
+
context "when :max_len == 256" do
|
|
46
|
+
let( :max_len ) { 256 }
|
|
47
|
+
its( :max_len ) { should == 256 }
|
|
48
|
+
end
|
|
64
49
|
end
|
|
65
50
|
|
|
66
51
|
|
|
67
|
-
describe
|
|
52
|
+
describe SendOutPort, ".new( VALID OPTIONS )" do
|
|
68
53
|
context "when an action output is set to #flow_mod(add) " do
|
|
69
|
-
it "should respond to #append" do
|
|
70
|
-
class FlowModAddController < Controller; end
|
|
71
|
-
network {
|
|
72
|
-
vswitch { datapath_id 0xabc }
|
|
73
|
-
}.run( FlowModAddController ) {
|
|
74
|
-
action = ActionOutput.new(:port => 1 )
|
|
75
|
-
action.should_receive( :append )
|
|
76
|
-
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => action )
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
|
|
81
54
|
it "should have its action set to output:1" do
|
|
82
55
|
class FlowModAddController < Controller; end
|
|
83
56
|
network {
|
|
84
57
|
vswitch { datapath_id 0xabc }
|
|
85
58
|
}.run( FlowModAddController ) {
|
|
86
59
|
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc,
|
|
87
|
-
:actions =>
|
|
60
|
+
:actions => SendOutPort.new( :port_number => 1 ) )
|
|
88
61
|
sleep 2 # FIXME: wait to send_flow_mod_add
|
|
89
62
|
vswitch( "0xabc" ).should have( 1 ).flows
|
|
90
63
|
vswitch( "0xabc" ).flows[0].actions.should match( /output:1/ )
|
|
@@ -99,7 +72,7 @@ describe ActionOutput, ".new( VALID OPTIONS )" do
|
|
|
99
72
|
network {
|
|
100
73
|
vswitch { datapath_id 0xabc }
|
|
101
74
|
}.run( FlowModAddController ) {
|
|
102
|
-
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => [
|
|
75
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => [ SendOutPort.new( :port_number => 1 ), SendOutPort.new( :port_number => 2 ) ] )
|
|
103
76
|
sleep 2 # FIXME: wait to send_flow_mod_add
|
|
104
77
|
vswitch( "0xabc" ).should have( 1 ).flows
|
|
105
78
|
vswitch( "0xabc" ).flows[0].actions.should match( /output:1\/output:2/ )
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetEthDstAddr, %{.new( "52:54:00:a8:ad:8c" )} do
|
|
24
|
+
subject { SetEthDstAddr.new( "52:54:00:a8:ad:8c" ) }
|
|
25
|
+
its( :mac_address ) { should == Mac.new( "52:54:00:a8:ad:8c" ) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
describe SetEthDstAddr, %{.new( "INVALID MAC STRING" )} do
|
|
30
|
+
it { expect { SetEthDstAddr.new( "INVALID MAC STRING" ) }.to raise_error( ArgumentError ) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
describe SetEthDstAddr, ".new( number )" do
|
|
35
|
+
subject { SetEthDstAddr.new( mac_address ) }
|
|
36
|
+
|
|
37
|
+
context "when mac_address == 0x525400a8ad8c" do
|
|
38
|
+
let( :mac_address ) { 0x525400a8ad8c }
|
|
39
|
+
its( :mac_address ) { should == Mac.new( "52:54:00:a8:ad:8c" ) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it_validates "option range", :mac_address, 0..0xffffffffffff
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
describe SetEthDstAddr, ".new( [ 1, 2, 3 ] )" do
|
|
47
|
+
it { expect { SetEthDstAddr.new( [ 1, 2, 3 ] ) }.to raise_error( TypeError ) }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
describe SetEthDstAddr, ".new( VALID OPTION )" do
|
|
52
|
+
context "when sending #flow_mod(add) with action set to mod_dl_dst" do
|
|
53
|
+
it "should have a flow with action set to mod_dl_dst" do
|
|
54
|
+
class FlowModAddController < Controller; end
|
|
55
|
+
network {
|
|
56
|
+
vswitch { datapath_id 0xabc }
|
|
57
|
+
}.run( FlowModAddController ) {
|
|
58
|
+
controller( "FlowModAddController" ).send_flow_mod_add(
|
|
59
|
+
0xabc,
|
|
60
|
+
:actions => SetEthDstAddr.new( "52:54:00:a8:ad:8c" )
|
|
61
|
+
)
|
|
62
|
+
sleep 2 # FIXME: wait to send_flow_mod
|
|
63
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
64
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_dl_dst:52:54:00:a8:ad:8c/ )
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### Local variables:
|
|
72
|
+
### mode: Ruby
|
|
73
|
+
### coding: utf-8-unix
|
|
74
|
+
### indent-tabs-mode: nil
|
|
75
|
+
### End:
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetEthSrcAddr, %{.new( "52:54:00:a8:ad:8c" )} do
|
|
24
|
+
subject { SetEthSrcAddr.new( "52:54:00:a8:ad:8c" ) }
|
|
25
|
+
its( :mac_address ) { should == Mac.new( "52:54:00:a8:ad:8c" ) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
describe SetEthSrcAddr, %{.new( "INVALID MAC STRING" )} do
|
|
30
|
+
it { expect { SetEthSrcAddr.new( "INVALID MAC STRING" ) }.to raise_error( ArgumentError ) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
describe SetEthSrcAddr, ".new( number )" do
|
|
35
|
+
subject { SetEthSrcAddr.new( mac_address ) }
|
|
36
|
+
|
|
37
|
+
context "when mac_address == 0x525400a8ad8c" do
|
|
38
|
+
let( :mac_address ) { 0x525400a8ad8c }
|
|
39
|
+
its( :mac_address ) { should == Mac.new( "52:54:00:a8:ad:8c" ) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it_validates "option range", :mac_address, 0..0xffffffffffff
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
describe SetEthSrcAddr, ".new( [ 1, 2, 3 ] )" do
|
|
47
|
+
it { expect { SetEthSrcAddr.new( [ 1, 2, 3 ] ) }.to raise_error( TypeError ) }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
describe SetEthSrcAddr, ".new( VALID OPTION )" do
|
|
52
|
+
context "when sending #flow_mod(add) with action set to mod_dl_src" do
|
|
53
|
+
it "should have a flow with action set to mod_dl_src" do
|
|
54
|
+
class FlowModAddController < Controller; end
|
|
55
|
+
network {
|
|
56
|
+
vswitch { datapath_id 0xabc }
|
|
57
|
+
}.run( FlowModAddController ) {
|
|
58
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => SetEthSrcAddr.new( "52:54:00:a8:ad:8c" ) )
|
|
59
|
+
sleep 2 # FIXME: wait to send_flow_mod
|
|
60
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
61
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_dl_src:52:54:00:a8:ad:8c/ )
|
|
62
|
+
}
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
### Local variables:
|
|
69
|
+
### mode: Ruby
|
|
70
|
+
### coding: utf-8-unix
|
|
71
|
+
### indent-tabs-mode: nil
|
|
72
|
+
### End:
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetIpDstAddr, ".new(ip_address)" do
|
|
24
|
+
subject { SetIpDstAddr.new( ip_address ) }
|
|
25
|
+
|
|
26
|
+
context %{when "192.168.1.1"} do
|
|
27
|
+
let( :ip_address ) { "192.168.1.1" }
|
|
28
|
+
its( :ip_address ) { should == IPAddr.new( "192.168.1.1" ) }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
describe ActionSetTpDst, ".new( array )" do
|
|
34
|
+
it { expect { ActionSetTpDst.new( [ 1, 2, 3 ] ) }.to raise_error( TypeError ) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
describe SetIpDstAddr, ".new( VALID OPTION )" do
|
|
39
|
+
context "when sending #flow_mod(add) with action set to mod_nw_dst" do
|
|
40
|
+
it "should have a flow with action set to mod_nw_dst" do
|
|
41
|
+
class FlowModAddController < Controller; end
|
|
42
|
+
network {
|
|
43
|
+
vswitch { datapath_id 0xabc }
|
|
44
|
+
}.run( FlowModAddController ) {
|
|
45
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => SetIpDstAddr.new( "192.168.1.1" ) )
|
|
46
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
47
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_nw_dst:192.168.1.1/ )
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Local variables:
|
|
55
|
+
### mode: Ruby
|
|
56
|
+
### coding: utf-8-unix
|
|
57
|
+
### indent-tabs-mode: nil
|
|
58
|
+
### End:
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetIpSrcAddr, ".new(ip_address)" do
|
|
24
|
+
subject { SetIpSrcAddr.new( ip_address ) }
|
|
25
|
+
|
|
26
|
+
context %{when "192.168.1.1"} do
|
|
27
|
+
let( :ip_address ) { "192.168.1.1" }
|
|
28
|
+
its( :ip_address ) { should == IPAddr.new( "192.168.1.1" ) }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
describe ActionSetTpSrc, ".new( array )" do
|
|
34
|
+
it { expect { ActionSetTpSrc.new( [ 1, 2, 3 ] ) }.to raise_error( TypeError ) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
describe SetIpSrcAddr, ".new( VALID OPTION )" do
|
|
39
|
+
context "when sending #flow_mod(add) with action set to mod_nw_src" do
|
|
40
|
+
it "should have a flow with action set to mod_nw_src" do
|
|
41
|
+
class FlowModAddController < Controller; end
|
|
42
|
+
network {
|
|
43
|
+
vswitch { datapath_id 0xabc }
|
|
44
|
+
}.run( FlowModAddController ) {
|
|
45
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => SetIpSrcAddr.new( "192.168.1.1" ) )
|
|
46
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
47
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_nw_src:192.168.1.1/ )
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Local variables:
|
|
55
|
+
### mode: Ruby
|
|
56
|
+
### coding: utf-8-unix
|
|
57
|
+
### indent-tabs-mode: nil
|
|
58
|
+
### End:
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetIpTos, ".new( number )" do
|
|
24
|
+
subject { SetIpTos.new( type_of_service ) }
|
|
25
|
+
|
|
26
|
+
context "when type_of_service == 32" do
|
|
27
|
+
let( :type_of_service ) { 32 }
|
|
28
|
+
its( :type_of_service ) { should == 32 }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it_validates "option range", :type_of_service, 0..( 2 ** 8 - 1 )
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
describe SetIpTos, %{.new( "32" )} do
|
|
36
|
+
it { expect { SetIpTos.new( "32" ) }.to raise_error( TypeError ) }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
describe SetIpTos, ".new( [ 32 ] )" do
|
|
41
|
+
it { expect { SetIpTos.new( [ 32 ] ) }.to raise_error( TypeError ) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
describe SetIpTos, ".new( VALID OPTION )" do
|
|
46
|
+
context "when sending #flow_mod(add) with action set to mod_nw_tos" do
|
|
47
|
+
it "should have a flow with action set to mod_nw_tos" do
|
|
48
|
+
class FlowModAddController < Controller; end
|
|
49
|
+
network {
|
|
50
|
+
vswitch { datapath_id 0xabc }
|
|
51
|
+
}.run( FlowModAddController ) {
|
|
52
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => SetIpTos.new( 4 ) )
|
|
53
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
54
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_nw_tos:4/ )
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
### Local variables:
|
|
62
|
+
### mode: Ruby
|
|
63
|
+
### coding: utf-8-unix
|
|
64
|
+
### indent-tabs-mode: nil
|
|
65
|
+
### End:
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
20
|
+
require "trema"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
describe SetTransportDstPort, "new( number )" do
|
|
24
|
+
subject { SetTransportDstPort.new number }
|
|
25
|
+
|
|
26
|
+
context "when number == 5555" do
|
|
27
|
+
let( :number ) { 5555 }
|
|
28
|
+
its( :port_number ) { should == 5555 }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it_validates "option range", :number, 0..( 2 ** 16 - 1 )
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
describe SetTransportDstPort, ".new( string )" do
|
|
36
|
+
it { expect { SetTransportDstPort.new( "5555" ) }.to raise_error( TypeError ) }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
describe SetTransportDstPort, ".new( array )" do
|
|
41
|
+
it { expect { SetTransportDstPort.new( [ 1, 2, 3 ] ) }.to raise_error( TypeError ) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
describe SetTransportDstPort, ".new( VALID OPTION )" do
|
|
46
|
+
context "when sending #flow_mod(add) with action set to mod_tp_dst" do
|
|
47
|
+
it "should have a flow with action set to mod_tp_dst" do
|
|
48
|
+
class FlowModAddController < Controller; end
|
|
49
|
+
network {
|
|
50
|
+
vswitch { datapath_id 0xabc }
|
|
51
|
+
}.run( FlowModAddController ) {
|
|
52
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => SetTransportDstPort.new( 5555 ) )
|
|
53
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
54
|
+
vswitch( "0xabc" ).flows[0].actions.should match( /mod_tp_dst:5555/ )
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
### Local variables:
|
|
62
|
+
### mode: Ruby
|
|
63
|
+
### coding: utf-8-unix
|
|
64
|
+
### indent-tabs-mode: nil
|
|
65
|
+
### End:
|