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
|
@@ -0,0 +1,81 @@
|
|
|
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 VendorAction, "new( vendor_id )" do
|
|
24
|
+
subject { VendorAction.new vendor_id }
|
|
25
|
+
|
|
26
|
+
it_validates "option range", :vendor_id, 0..( 2 ** 32 - 1 )
|
|
27
|
+
|
|
28
|
+
context "when vendor_id == 0x00004cff" do
|
|
29
|
+
let( :vendor_id ) { 0x00004cff }
|
|
30
|
+
its( :vendor_id ) { should == 0x00004cff }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
describe VendorAction, ".new( string )" do
|
|
36
|
+
it { expect { VendorAction.new "0x00004cff" }.to raise_error( TypeError ) }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
describe VendorAction, ".new( array )" do
|
|
41
|
+
it { expect { VendorAction.new [ 1, 2, 3 ] }.to raise_error( TypeError ) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
describe VendorAction, ".new( vendor_id, body )" do
|
|
46
|
+
subject { VendorAction.new vendor_id, body }
|
|
47
|
+
let( :vendor_id ) { 0x00004cff }
|
|
48
|
+
|
|
49
|
+
context %{when body == "deadbeef".unpack( "C*" )} do
|
|
50
|
+
let( :body ) { "deadbeef".unpack( "C*" ) }
|
|
51
|
+
|
|
52
|
+
its( :vendor_id ) { should == 0x00004cff }
|
|
53
|
+
its( :body ) { should == [ 100, 101, 97, 100, 98, 101, 101, 102 ] }
|
|
54
|
+
|
|
55
|
+
context "when sending Flow Mod Add with action set to VendorAction" do
|
|
56
|
+
it "should have a flow with action set to VendorAction" do
|
|
57
|
+
class FlowModAddController < Controller; end
|
|
58
|
+
pending "Use Nicira's vendor ID and body"
|
|
59
|
+
network {
|
|
60
|
+
vswitch { datapath_id 0xabc }
|
|
61
|
+
}.run( FlowModAddController ) {
|
|
62
|
+
controller( "FlowModAddController" ).send_flow_mod_add( 0xabc, :actions => VendorAction.new( 0x00004cff, "deadbeef".unpack( "C*" ) ) )
|
|
63
|
+
vswitch( "0xabc" ).should have( 1 ).flows
|
|
64
|
+
vswitch( "0xabc" ).flows[ 0 ].actions.should match( /mod_vendor/ )
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
describe VendorAction, "new( vendor_id, string )" do
|
|
73
|
+
it { expect { VendorAction.new 0x00004cff, "deadbeef" }.to raise_error( TypeError ) }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
### Local variables:
|
|
78
|
+
### mode: Ruby
|
|
79
|
+
### coding: utf-8-unix
|
|
80
|
+
### indent-tabs-mode: nil
|
|
81
|
+
### End:
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
module Trema
|
|
24
|
+
describe Vendor, ".new" do
|
|
25
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
26
|
+
its ( :vendor ) { should == 0 }
|
|
27
|
+
its ( :data ) { should be_nil }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
describe Vendor, ".new(nil)" do
|
|
32
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
33
|
+
its ( :vendor ) { should == 0 }
|
|
34
|
+
its ( :data ) { should be_nil }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
describe Vendor, ".new(:transaction_id => value)" do
|
|
39
|
+
subject { Vendor.new( :transaction_id => transaction_id ) }
|
|
40
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
describe Vendor, ".new(:xid => value)" do
|
|
45
|
+
subject { Vendor.new( :xid => xid ) }
|
|
46
|
+
it_should_behave_like "any Openflow message with xid"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
describe Vendor, ".new(:vendor_id => value)", :nosudo => true do
|
|
51
|
+
subject { Vendor.new( :vendor => vendor ) }
|
|
52
|
+
let( :vendor ) { 0xdeadbeef }
|
|
53
|
+
its( :vendor ) { should == 0xdeadbeef }
|
|
54
|
+
its ( :data ) { should be_nil }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
describe Vendor, ".new(:data => value)", :nosudo => true do
|
|
59
|
+
subject { Vendor.new( :data => data ) }
|
|
60
|
+
let( :data ) { "VENDOR DATA".unpack( "C*" ) }
|
|
61
|
+
its( :data ) { should == [86, 69, 78, 68, 79, 82, 32, 68, 65, 84, 65] }
|
|
62
|
+
its ( :vendor ) { should == 0 }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
describe Vendor, '.new("INVALID OPTION")', :nosudo => true do
|
|
67
|
+
it { expect { Vendor.new "INVALID OPTION" }.to raise_error( TypeError ) }
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### Local variables:
|
|
73
|
+
### mode: Ruby
|
|
74
|
+
### coding: utf-8-unix
|
|
75
|
+
### indent-tabs-mode: nil
|
|
76
|
+
### End:
|
data/spec/trema_spec.rb
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
# published by the Free Software Foundation.
|
|
9
|
+
#
|
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License along
|
|
16
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
require File.join( File.dirname( __FILE__ ), "spec_helper" )
|
|
22
|
+
require "trema"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
describe Trema, ".constants" do
|
|
26
|
+
subject { Trema.constants }
|
|
27
|
+
|
|
28
|
+
it { should include "OFPC_FLOW_STATS" }
|
|
29
|
+
it { should include "OFPC_TABLE_STATS" }
|
|
30
|
+
it { should include "OFPC_PORT_STATS" }
|
|
31
|
+
it { should include "OFPC_STP" }
|
|
32
|
+
it { should include "OFPC_RESERVED" }
|
|
33
|
+
it { should include "OFPC_IP_REASM" }
|
|
34
|
+
it { should include "OFPC_QUEUE_STATS" }
|
|
35
|
+
it { should include "OFPC_ARP_MATCH_IP" }
|
|
36
|
+
|
|
37
|
+
it { should include "OFPAT_OUTPUT" }
|
|
38
|
+
it { should include "OFPAT_SET_VLAN_VID" }
|
|
39
|
+
it { should include "OFPAT_SET_VLAN_PCP" }
|
|
40
|
+
it { should include "OFPAT_STRIP_VLAN" }
|
|
41
|
+
it { should include "OFPAT_SET_DL_SRC" }
|
|
42
|
+
it { should include "OFPAT_SET_DL_DST" }
|
|
43
|
+
it { should include "OFPAT_SET_NW_SRC" }
|
|
44
|
+
it { should include "OFPAT_SET_NW_DST" }
|
|
45
|
+
it { should include "OFPAT_SET_NW_TOS" }
|
|
46
|
+
it { should include "OFPAT_SET_TP_DST" }
|
|
47
|
+
it { should include "OFPAT_ENQUEUE" }
|
|
48
|
+
it { should include "OFPAT_VENDOR" }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
### Local variables:
|
|
53
|
+
### mode: Ruby
|
|
54
|
+
### coding: utf-8-unix
|
|
55
|
+
### indent-tabs-mode: nil
|
|
56
|
+
### End:
|
|
@@ -102,16 +102,8 @@ static void
|
|
|
102
102
|
handle_switch_ready( uint64_t datapath_id, void *user_data ) {
|
|
103
103
|
UNUSED( user_data );
|
|
104
104
|
|
|
105
|
-
buffer *buffer;
|
|
106
|
-
|
|
107
105
|
dump( "[switch_ready]" );
|
|
108
106
|
dump( "datapath_id: %#" PRIx64, datapath_id );
|
|
109
|
-
|
|
110
|
-
buffer = create_features_request( get_transaction_id() );
|
|
111
|
-
|
|
112
|
-
send_openflow_message( datapath_id, buffer );
|
|
113
|
-
|
|
114
|
-
free_buffer( buffer );
|
|
115
107
|
}
|
|
116
108
|
|
|
117
109
|
|
|
@@ -21,12 +21,60 @@
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class Dumper < Controller
|
|
24
|
+
def switch_ready datapath_id
|
|
25
|
+
info "[switch_ready]"
|
|
26
|
+
info " datapath_id: #{ datapath_id.to_hex }"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
24
30
|
def switch_disconnected datapath_id
|
|
25
31
|
info "[switch_disconnected]"
|
|
26
32
|
info " datapath_id: #{ datapath_id.to_hex }"
|
|
27
33
|
end
|
|
28
34
|
|
|
29
35
|
|
|
36
|
+
def openflow_error message
|
|
37
|
+
info "[error]"
|
|
38
|
+
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
39
|
+
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
40
|
+
info "type: #{ message.type.to_hex }"
|
|
41
|
+
info "code: #{ message.code.to_hex }"
|
|
42
|
+
info "data: #{ message.data.unpack "H*" }"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def vendor message
|
|
47
|
+
info "[vendor]"
|
|
48
|
+
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
49
|
+
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
50
|
+
info "data:"
|
|
51
|
+
info "#{ message.buffer.unpack "H*" }"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def features_reply datapath_id, message
|
|
56
|
+
info "[features_reply]"
|
|
57
|
+
info "datapath_id: #{ datapath_id.to_hex }"
|
|
58
|
+
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
59
|
+
info "n_buffers: #{ message.n_buffers }"
|
|
60
|
+
info "n_tables: #{ message.n_tables }"
|
|
61
|
+
info "capabilities: #{ message.capabilities.to_hex }"
|
|
62
|
+
info "actions: #{ message.actions.to_hex }"
|
|
63
|
+
message.ports.each do | each |
|
|
64
|
+
dump_phy_port each
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def get_config_reply message
|
|
70
|
+
info "[get_config_reply]"
|
|
71
|
+
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
72
|
+
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
73
|
+
info "flags: #{ message.flags.to_hex }"
|
|
74
|
+
info "miss_send_len: #{ message.miss_send_len }"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
30
78
|
def packet_in datapath_id, message
|
|
31
79
|
info "[packet_in]"
|
|
32
80
|
info " datapath_id: #{ datapath_id.to_hex }"
|
|
@@ -70,18 +118,9 @@ class Dumper < Controller
|
|
|
70
118
|
end
|
|
71
119
|
|
|
72
120
|
|
|
73
|
-
def
|
|
74
|
-
info "[get_config_reply]"
|
|
75
|
-
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
76
|
-
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
77
|
-
info "flags: #{ message.flags.to_hex }"
|
|
78
|
-
info "miss_send_len: #{ message.miss_send_len }"
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def port_status message
|
|
121
|
+
def port_status datapath_id, message
|
|
83
122
|
info "[port_status]"
|
|
84
|
-
info "datapath_id: #{
|
|
123
|
+
info "datapath_id: #{ datapath_id.to_hex }"
|
|
85
124
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
86
125
|
info "reason: #{ message.reason.to_hex }"
|
|
87
126
|
dump_phy_port message.phy_port
|
|
@@ -98,13 +137,10 @@ class Dumper < Controller
|
|
|
98
137
|
end
|
|
99
138
|
|
|
100
139
|
|
|
101
|
-
def
|
|
102
|
-
info "[
|
|
140
|
+
def barrier_reply message
|
|
141
|
+
info "[barrier_reply]"
|
|
103
142
|
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
104
143
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
105
|
-
info "type: #{ message.type.to_hex }"
|
|
106
|
-
info "code: #{ message.code.to_hex }"
|
|
107
|
-
info "data: #{ message.data.unpack "H*" }"
|
|
108
144
|
end
|
|
109
145
|
|
|
110
146
|
|
|
@@ -118,42 +154,6 @@ class Dumper < Controller
|
|
|
118
154
|
end
|
|
119
155
|
|
|
120
156
|
|
|
121
|
-
def barrier_reply message
|
|
122
|
-
info "[barrier_reply]"
|
|
123
|
-
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
124
|
-
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
def features_reply message
|
|
129
|
-
info "[features_reply]"
|
|
130
|
-
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
131
|
-
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
132
|
-
info "n_buffers: #{ message.n_buffers }"
|
|
133
|
-
info "n_tables: #{ message.n_tables }"
|
|
134
|
-
info "capabilities: #{ message.capabilities.to_hex }"
|
|
135
|
-
info "actions: #{ message.actions.to_hex }"
|
|
136
|
-
message.ports.each do | each |
|
|
137
|
-
dump_phy_port each
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def vendor message
|
|
143
|
-
info "[vendor]"
|
|
144
|
-
info "datapath_id: #{ message.datapath_id.to_hex }"
|
|
145
|
-
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
146
|
-
info "data:"
|
|
147
|
-
info message.buffer.unpack( "H*" )
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def list_switches_reply dpids
|
|
152
|
-
info "[list_switches_reply]"
|
|
153
|
-
info "switches = %s" % dpids.collect { | each | each.to_hex }.join( ", " )
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
|
|
157
157
|
##############################################################################
|
|
158
158
|
private
|
|
159
159
|
##############################################################################
|
|
@@ -26,7 +26,7 @@ require "fdb"
|
|
|
26
26
|
#
|
|
27
27
|
# A OpenFlow controller class that emulates a layer-2 switch.
|
|
28
28
|
#
|
|
29
|
-
class LearningSwitch <
|
|
29
|
+
class LearningSwitch < Controller
|
|
30
30
|
add_timer_event :age_fdb, 5, :periodic
|
|
31
31
|
|
|
32
32
|
|
|
@@ -61,7 +61,7 @@ class LearningSwitch < Trema::Controller
|
|
|
61
61
|
send_flow_mod_add(
|
|
62
62
|
datapath_id,
|
|
63
63
|
:match => ExactMatch.from( message ),
|
|
64
|
-
:actions =>
|
|
64
|
+
:actions => ActionOutput.new( :port => port_no )
|
|
65
65
|
)
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -70,7 +70,7 @@ class LearningSwitch < Trema::Controller
|
|
|
70
70
|
send_packet_out(
|
|
71
71
|
datapath_id,
|
|
72
72
|
:packet_in => message,
|
|
73
|
-
:actions =>
|
|
73
|
+
:actions => ActionOutput.new( :port => port_no )
|
|
74
74
|
)
|
|
75
75
|
end
|
|
76
76
|
|
|
@@ -29,7 +29,7 @@ require "fdb"
|
|
|
29
29
|
#
|
|
30
30
|
# A OpenFlow controller class that emulates multiple layer-2 switches.
|
|
31
31
|
#
|
|
32
|
-
class MultiLearningSwitch <
|
|
32
|
+
class MultiLearningSwitch < Controller
|
|
33
33
|
add_timer_event :age_fdbs, 5, :periodic
|
|
34
34
|
|
|
35
35
|
|
|
@@ -69,7 +69,7 @@ class MultiLearningSwitch < Trema::Controller
|
|
|
69
69
|
send_flow_mod_add(
|
|
70
70
|
datapath_id,
|
|
71
71
|
:match => ExactMatch.from( message ),
|
|
72
|
-
:actions =>
|
|
72
|
+
:actions => ActionOutput.new( :port => port_no )
|
|
73
73
|
)
|
|
74
74
|
end
|
|
75
75
|
|
|
@@ -78,7 +78,7 @@ class MultiLearningSwitch < Trema::Controller
|
|
|
78
78
|
send_packet_out(
|
|
79
79
|
datapath_id,
|
|
80
80
|
:packet_in => message,
|
|
81
|
-
:actions =>
|
|
81
|
+
:actions => ActionOutput.new( :port => port_no )
|
|
82
82
|
)
|
|
83
83
|
end
|
|
84
84
|
|
|
@@ -27,12 +27,12 @@ class FeaturesRequestController < Controller
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def features_reply message
|
|
31
|
-
info "datapath_id: #{
|
|
30
|
+
def features_reply datapath_id, message
|
|
31
|
+
info "datapath_id: #{ datapath_id.to_hex }"
|
|
32
32
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
33
33
|
info "n_buffers: #{ message.n_buffers }"
|
|
34
34
|
info "n_tables: #{ message.n_tables }"
|
|
35
|
-
print_capabilities message.capabilities
|
|
35
|
+
print_capabilities message.capabilities
|
|
36
36
|
print_actions message.actions
|
|
37
37
|
print_ports message.ports
|
|
38
38
|
end
|