trema 0.4.6 → 0.4.7
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.travis.yml +24 -7
- data/Gemfile +19 -27
- data/Guardfile +6 -0
- data/README.md +13 -5
- data/Rakefile +418 -415
- data/bin/quality +2 -2
- data/bin/trema +103 -105
- data/bin/trema-config +7 -7
- data/build.rb +2 -2
- data/cruise.rb +109 -83
- data/features/dsl/switch_port_specifier.feature +1 -1
- data/features/examples/dumper.feature +9 -41
- data/features/examples/hello_trema.feature +1 -1
- data/features/examples/learning_switch.feature +7 -7
- data/features/examples/list_switches.feature +5 -5
- data/features/examples/message.set_config.feature +11 -11
- data/features/examples/message.vendor-action.feature +7 -7
- data/features/examples/message.vendor-stats-request.feature +1 -1
- data/features/examples/multi_learning_switch.feature +7 -7
- data/features/examples/openflow_message.echo.feature +15 -15
- data/features/examples/openflow_message.features_request.feature +12 -12
- data/features/examples/openflow_message.hello.feature +13 -13
- data/features/examples/packet_in.feature +8 -8
- data/features/examples/patch_panel.feature +1 -1
- data/features/examples/repeater_hub.feature +7 -7
- data/features/examples/switch_info.feature +16 -16
- data/features/examples/switch_monitor.feature +11 -11
- data/features/examples/transparent_firewall.feature +73 -0
- data/features/handlers/switch_ready.feature +1 -1
- data/features/step_definitions/misc_steps.rb +24 -24
- data/features/step_definitions/send_packets_steps.rb +2 -2
- data/features/step_definitions/stats_steps.rb +6 -6
- data/features/support/env.rb +15 -15
- data/features/support/hooks.rb +9 -9
- data/features/switch_event/add_forward_entry.feature +3 -3
- data/features/switch_event/delete_forward_entry.feature +3 -3
- data/features/switch_event/dump_forward_entries.feature +2 -2
- data/features/switch_event/set_forward_entries.feature +2 -2
- data/features/trema_commands/dump_flows.feature +1 -0
- data/features/trema_commands/help.feature +1 -0
- data/features/trema_commands/help_option.feature +1 -0
- data/features/trema_commands/kill.feature +1 -0
- data/features/trema_commands/killall.feature +1 -0
- data/features/trema_commands/port_down.feature +1 -0
- data/features/trema_commands/port_up.feature +1 -0
- data/features/trema_commands/reset_stats.feature +1 -0
- data/features/trema_commands/run.feature +1 -0
- data/features/trema_commands/send_packets.feature +2 -1
- data/features/trema_commands/show_stats.feature +1 -0
- data/features/trema_commands/up.feature +1 -0
- data/features/trema_commands/version.feature +1 -0
- data/features/trema_commands/version_option.feature +1 -0
- data/rubocop-todo.yml +159 -0
- data/ruby/blocker.rb +15 -17
- data/ruby/extconf.rb +19 -19
- data/ruby/sub-process.rb +29 -29
- data/ruby/trema/aggregate-stats-reply.rb +2 -2
- data/ruby/trema/app.rb +13 -13
- data/ruby/trema/cli.rb +45 -45
- data/ruby/trema/command.rb +14 -14
- data/ruby/trema/command/dump_flows.rb +5 -5
- data/ruby/trema/command/kill.rb +13 -13
- data/ruby/trema/command/killall.rb +1 -1
- data/ruby/trema/command/netns.rb +3 -3
- data/ruby/trema/command/port_down.rb +7 -7
- data/ruby/trema/command/port_up.rb +7 -7
- data/ruby/trema/command/reset_stats.rb +6 -6
- data/ruby/trema/command/ruby.rb +2 -2
- data/ruby/trema/command/run.rb +23 -23
- data/ruby/trema/command/send_packets.rb +9 -9
- data/ruby/trema/command/shell.rb +14 -16
- data/ruby/trema/command/show_stats.rb +9 -9
- data/ruby/trema/command/up.rb +4 -4
- data/ruby/trema/command/version.rb +1 -1
- data/ruby/trema/controller.rb +10 -10
- data/ruby/trema/custom-switch.rb +4 -4
- data/ruby/trema/daemon.rb +21 -21
- data/ruby/trema/desc-stats-reply.rb +2 -2
- data/ruby/trema/dsl.rb +5 -5
- data/ruby/trema/dsl/configuration.rb +7 -7
- data/ruby/trema/dsl/context.rb +10 -10
- data/ruby/trema/dsl/custom-switch.rb +3 -3
- data/ruby/trema/dsl/link.rb +2 -2
- data/ruby/trema/dsl/netns.rb +9 -9
- data/ruby/trema/dsl/parser.rb +14 -14
- data/ruby/trema/dsl/rswitch.rb +3 -3
- data/ruby/trema/dsl/run.rb +4 -4
- data/ruby/trema/dsl/runner.rb +20 -20
- data/ruby/trema/dsl/stanza.rb +5 -5
- data/ruby/trema/dsl/switch.rb +14 -14
- data/ruby/trema/dsl/syntax.rb +54 -54
- data/ruby/trema/dsl/vhost.rb +9 -9
- data/ruby/trema/dsl/vswitch.rb +4 -4
- data/ruby/trema/enqueue.rb +11 -11
- data/ruby/trema/exact-match.rb +1 -1
- data/ruby/trema/executables.rb +19 -19
- data/ruby/trema/flow-stats-reply.rb +2 -2
- data/ruby/trema/flow.rb +8 -8
- data/ruby/trema/hardware-switch.rb +2 -2
- data/ruby/trema/host.rb +18 -18
- data/ruby/trema/link.rb +9 -9
- data/ruby/trema/mac.rb +1 -5
- data/ruby/trema/match.c +0 -1
- data/ruby/trema/monkey-patch/integer.rb +3 -3
- data/ruby/trema/monkey-patch/integer/base-conversions.rb +1 -1
- data/ruby/trema/monkey-patch/integer/ranges.rb +2 -2
- data/ruby/trema/monkey-patch/integer/validators.rb +1 -1
- data/ruby/trema/monkey-patch/module.rb +2 -2
- data/ruby/trema/monkey-patch/module/class-method.rb +2 -2
- data/ruby/trema/monkey-patch/module/deprecation.rb +1 -1
- data/ruby/trema/monkey-patch/string.rb +1 -1
- data/ruby/trema/monkey-patch/string/inflectors.rb +7 -7
- data/ruby/trema/netns.rb +6 -6
- data/ruby/trema/network-component.rb +7 -7
- data/ruby/trema/ofctl.rb +13 -13
- data/ruby/trema/open-vswitch.rb +25 -25
- data/ruby/trema/openflow-switch.rb +1 -1
- data/ruby/trema/ordered-hash.rb +8 -8
- data/ruby/trema/packet-in.c +0 -1
- data/ruby/trema/packet-queue.rb +8 -8
- data/ruby/trema/packetin-filter.rb +9 -9
- data/ruby/trema/path.rb +32 -32
- data/ruby/trema/phost.rb +5 -5
- data/ruby/trema/port-mod.c +0 -1
- data/ruby/trema/port-stats-reply.rb +2 -2
- data/ruby/trema/port-status-add.rb +2 -2
- data/ruby/trema/port-status-delete.rb +2 -2
- data/ruby/trema/port-status-modify.rb +2 -2
- data/ruby/trema/port.c +0 -1
- data/ruby/trema/process.rb +7 -7
- data/ruby/trema/queue-stats-reply.rb +2 -2
- data/ruby/trema/ruby-switch.rb +6 -6
- data/ruby/trema/send-out-port.rb +11 -11
- data/ruby/trema/set-eth-addr.rb +5 -5
- data/ruby/trema/set-eth-dst-addr.rb +1 -1
- data/ruby/trema/set-eth-src-addr.rb +1 -1
- data/ruby/trema/set-ip-addr.rb +6 -6
- data/ruby/trema/set-ip-dst-addr.rb +1 -1
- data/ruby/trema/set-ip-src-addr.rb +1 -1
- data/ruby/trema/set-ip-tos.rb +6 -6
- data/ruby/trema/set-transport-dst-port.rb +2 -2
- data/ruby/trema/set-transport-port.rb +7 -7
- data/ruby/trema/set-transport-src-port.rb +3 -3
- data/ruby/trema/set-vlan-priority.rb +6 -6
- data/ruby/trema/set-vlan-vid.rb +6 -6
- data/ruby/trema/shell.rb +10 -10
- data/ruby/trema/shell/down.rb +3 -3
- data/ruby/trema/shell/killall.rb +1 -1
- data/ruby/trema/shell/link.rb +14 -14
- data/ruby/trema/shell/reset_stats.rb +6 -6
- data/ruby/trema/shell/run.rb +7 -7
- data/ruby/trema/shell/send_packets.rb +3 -3
- data/ruby/trema/shell/show_stats.rb +7 -7
- data/ruby/trema/shell/up.rb +5 -5
- data/ruby/trema/shell/vhost.rb +4 -4
- data/ruby/trema/shell/vswitch.rb +7 -7
- data/ruby/trema/stats-helper.rb +3 -3
- data/ruby/trema/stats-reply.c +0 -1
- data/ruby/trema/strip-vlan-header.rb +1 -1
- data/ruby/trema/switch-daemon.rb +9 -9
- data/ruby/trema/switch-manager.rb +9 -9
- data/ruby/trema/switch.rb +7 -7
- data/ruby/trema/table-stats-reply.rb +2 -2
- data/ruby/trema/timers.rb +12 -12
- data/ruby/trema/trema.c +0 -1
- data/ruby/trema/tremashark.rb +1 -1
- data/ruby/trema/util.rb +25 -27
- data/ruby/trema/vendor-action.rb +10 -10
- data/ruby/trema/vendor-stats-reply.rb +2 -2
- data/ruby/trema/version.rb +1 -1
- data/spec/spec_helper.rb +50 -52
- data/spec/support/action.rb +9 -12
- data/spec/support/mandatory-option.rb +15 -18
- data/spec/support/matchers/constant.rb +7 -7
- data/spec/support/openflow-message.rb +76 -79
- data/spec/support/port-status.rb +7 -10
- data/spec/trema/app_spec.rb +27 -27
- data/spec/trema/barrier-reply_spec.rb +10 -10
- data/spec/trema/barrier-request_spec.rb +35 -35
- data/spec/trema/cli_spec.rb +63 -63
- data/spec/trema/controller_spec.rb +3 -3
- data/spec/trema/default-logger_spec.rb +4 -4
- data/spec/trema/dsl/configuration_spec.rb +47 -47
- data/spec/trema/dsl/link_spec.rb +11 -11
- data/spec/trema/dsl/run_spec.rb +19 -19
- data/spec/trema/dsl/runner_spec.rb +91 -91
- data/spec/trema/dsl/switch_spec.rb +16 -16
- data/spec/trema/dsl/syntax_spec.rb +22 -22
- data/spec/trema/dsl/vhost_spec.rb +37 -37
- data/spec/trema/dsl/vswitch_spec.rb +21 -21
- data/spec/trema/echo-reply_spec.rb +29 -29
- data/spec/trema/echo-request_spec.rb +54 -54
- data/spec/trema/enqueue_spec.rb +25 -25
- data/spec/trema/error_spec.rb +30 -30
- data/spec/trema/executables_spec.rb +20 -20
- data/spec/trema/features-reply_spec.rb +41 -41
- data/spec/trema/features-request_spec.rb +35 -35
- data/spec/trema/flow-mod_spec.rb +32 -32
- data/spec/trema/flow-removed_spec.rb +62 -62
- data/spec/trema/get-config-reply_spec.rb +14 -12
- data/spec/trema/get-config-request_spec.rb +35 -35
- data/spec/trema/hardware-switch_spec.rb +12 -12
- data/spec/trema/hello_spec.rb +17 -17
- data/spec/trema/host_spec.rb +71 -71
- data/spec/trema/link_spec.rb +13 -13
- data/spec/trema/list-switches-reply_spec.rb +10 -10
- data/spec/trema/match_spec.rb +41 -41
- data/spec/trema/open-vswitch_spec.rb +45 -45
- data/spec/trema/openflow-error_spec.rb +67 -65
- data/spec/trema/packet-in_spec.rb +450 -446
- data/spec/trema/packet-out_spec.rb +42 -42
- data/spec/trema/packetin-filter_spec.rb +5 -5
- data/spec/trema/port-mod_spec.rb +32 -32
- data/spec/trema/port-status-add_spec.rb +3 -3
- data/spec/trema/port-status-delete_spec.rb +3 -3
- data/spec/trema/port-status-modify_spec.rb +16 -16
- data/spec/trema/port-status_spec.rb +2 -2
- data/spec/trema/port_spec.rb +21 -21
- data/spec/trema/process_spec.rb +22 -22
- data/spec/trema/queue-get-config-reply_spec.rb +21 -20
- data/spec/trema/queue-get-config-request_spec.rb +24 -24
- data/spec/trema/send-out-port_spec.rb +42 -42
- data/spec/trema/set-config_spec.rb +31 -31
- data/spec/trema/set-eth-addr_spec.rb +21 -21
- data/spec/trema/set-ip-addr_spec.rb +29 -29
- data/spec/trema/set-ip-tos_spec.rb +26 -26
- data/spec/trema/set-transport-dst-port_spec.rb +22 -22
- data/spec/trema/set-transport-src-port_spec.rb +22 -22
- data/spec/trema/set-vlan-priority_spec.rb +23 -23
- data/spec/trema/set-vlan-vid_spec.rb +23 -23
- data/spec/trema/shell/vhost_spec.rb +21 -21
- data/spec/trema/shell/vswitch_spec.rb +30 -30
- data/spec/trema/stats-reply_spec.rb +183 -173
- data/spec/trema/stats-request_spec.rb +66 -66
- data/spec/trema/strip-vlan-header_spec.rb +11 -11
- data/spec/trema/switch-daemon_spec.rb +34 -34
- data/spec/trema/switch-disconnected_spec.rb +17 -17
- data/spec/trema/switch-manager_spec.rb +6 -6
- data/spec/trema/tremashark_spec.rb +4 -4
- data/spec/trema/util_spec.rb +35 -35
- data/spec/trema/vendor-action_spec.rb +26 -26
- data/spec/trema/vendor_spec.rb +27 -27
- data/spec/trema_spec.rb +2 -2
- data/src/examples/cbench_switch/cbench-switch.rb +3 -3
- data/src/examples/dumper/dumper.rb +31 -31
- data/src/examples/hello_trema/hello-trema.rb +2 -2
- data/src/examples/learning_switch/fdb.rb +14 -14
- data/src/examples/learning_switch/learning-switch.rb +12 -10
- data/src/examples/learning_switch/learning_switch.c +22 -39
- data/src/examples/list_switches/list-switches.rb +3 -3
- data/src/examples/match_compare/match-compare.rb +20 -20
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +12 -12
- data/src/examples/openflow_message/echo.rb +4 -4
- data/src/examples/openflow_message/example.rb +7 -7
- data/src/examples/openflow_message/features-request.rb +31 -31
- data/src/examples/openflow_message/hello.rb +2 -2
- data/src/examples/openflow_message/set-config.rb +4 -4
- data/src/examples/openflow_message/vendor-action.rb +3 -3
- data/src/examples/openflow_message/vendor-stats-request.rb +9 -9
- data/src/examples/packet_in/packet-in.rb +2 -2
- data/src/examples/patch_panel/patch-panel.rb +9 -9
- data/src/examples/repeater_hub/repeater-hub.rb +4 -4
- data/src/examples/repeater_hub/repeater-hub_spec.rb +65 -65
- data/src/examples/simple_router/arp-table.rb +7 -7
- data/src/examples/simple_router/interface.rb +10 -10
- data/src/examples/simple_router/routing-table.rb +4 -4
- data/src/examples/simple_router/simple-router.rb +3 -3
- data/src/examples/switch_info/switch-info.rb +9 -9
- data/src/examples/switch_monitor/switch-monitor.rb +4 -4
- data/src/examples/traffic_monitor/counter.rb +6 -6
- data/src/examples/traffic_monitor/fdb.rb +4 -4
- data/src/examples/traffic_monitor/traffic-monitor.rb +12 -12
- data/src/examples/transparent_firewall/README.md +61 -0
- data/src/examples/transparent_firewall/aggregated-delegated-afrinic.txt +713 -0
- data/src/examples/transparent_firewall/aggregated-delegated-apnic.txt +3440 -0
- data/src/examples/transparent_firewall/aggregated-delegated-arin.txt +11342 -0
- data/src/examples/transparent_firewall/aggregated-delegated-lacnic.txt +1937 -0
- data/src/examples/transparent_firewall/aggregated-delegated-ripencc.txt +7329 -0
- data/src/examples/transparent_firewall/block-rfc1918.rb +86 -0
- data/src/examples/transparent_firewall/pass-delegated.rb +178 -0
- data/src/examples/transparent_firewall/regen_aggregated.sh +53 -0
- data/src/examples/transparent_firewall/stats-to-cidrs.rb +59 -0
- data/src/lib/messenger.c +14 -5
- data/src/lib/openflow_message.c +0 -5
- data/tasks/rubocop.rake +22 -0
- data/trema +1 -1
- data/trema-config +1 -1
- data/trema.gemspec +22 -22
- metadata +30 -16
|
@@ -16,53 +16,53 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
require File.join(
|
|
20
|
-
require
|
|
19
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
|
20
|
+
require 'trema'
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
describe VendorAction,
|
|
23
|
+
describe VendorAction, 'new(vendor_id)', :type => 'actions' do
|
|
24
24
|
subject { VendorAction.new vendor_id }
|
|
25
25
|
|
|
26
|
-
context
|
|
27
|
-
let(
|
|
28
|
-
its(
|
|
26
|
+
context 'with vendor_id (0x00004cff)' do
|
|
27
|
+
let(:vendor_id) { 0x00004cff }
|
|
28
|
+
its(:vendor_id) { should == 0x00004cff }
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
it_validates
|
|
31
|
+
it_validates 'option is within range', :vendor_id, 0..( 2**32 - 1)
|
|
32
32
|
|
|
33
|
-
context
|
|
34
|
-
let(
|
|
35
|
-
it { expect { subject }.to raise_error(
|
|
33
|
+
context 'with vendor_id (0x00004cff)' do
|
|
34
|
+
let(:vendor_id) { '0x00004cff' }
|
|
35
|
+
it { expect { subject }.to raise_error(TypeError) }
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
describe VendorAction,
|
|
40
|
+
describe VendorAction, '.new(0x00002320, body)', :type => 'actions' do
|
|
41
41
|
subject { VendorAction.new 0x00002320, body }
|
|
42
42
|
|
|
43
|
-
context
|
|
44
|
-
let(
|
|
45
|
-
it { expect { subject }.to raise_error(
|
|
43
|
+
context 'with body (deadbeef)' do
|
|
44
|
+
let(:body) { 'deadbeef' }
|
|
45
|
+
it { expect { subject }.to raise_error(TypeError) }
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
context
|
|
49
|
-
let(
|
|
50
|
-
it { expect { subject }.to raise_error(
|
|
48
|
+
context 'with body 9 octets long' do
|
|
49
|
+
let(:body) { [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08] }
|
|
50
|
+
it { expect { subject }.to raise_error(ArgumentError) }
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
context
|
|
54
|
-
let(
|
|
53
|
+
context 'when sending a Flow Mod with VendorAction' do
|
|
54
|
+
let(:body) { [0x00, 0x08, 0x54, 0x72, 0x65, 0x6d, 0x61, 0x00] }
|
|
55
55
|
|
|
56
|
-
it
|
|
56
|
+
it 'should insert a new flow entry with action (note:54.72.65.6d.61.00)' do
|
|
57
57
|
class TestController < Controller; end
|
|
58
|
-
network
|
|
58
|
+
network do
|
|
59
59
|
vswitch { datapath_id 0xabc }
|
|
60
|
-
|
|
61
|
-
controller(
|
|
60
|
+
end.run(TestController) do
|
|
61
|
+
controller('TestController').send_flow_mod_add(0xabc, :actions => subject)
|
|
62
62
|
sleep 2
|
|
63
|
-
expect(
|
|
64
|
-
expect(
|
|
65
|
-
|
|
63
|
+
expect(vswitch('0xabc')).to have(1).flows
|
|
64
|
+
expect(vswitch('0xabc').flows[ 0].actions).to eq('note:54.72.65.6d.61.00')
|
|
65
|
+
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
end
|
data/spec/trema/vendor_spec.rb
CHANGED
|
@@ -16,55 +16,55 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
require File.join(
|
|
20
|
-
require
|
|
19
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
|
20
|
+
require 'trema'
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
module Trema
|
|
24
|
-
describe Vendor,
|
|
25
|
-
it_should_behave_like
|
|
26
|
-
its ( :vendor
|
|
27
|
-
its ( :data
|
|
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
28
|
end
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
describe Vendor,
|
|
32
|
-
it_should_behave_like
|
|
33
|
-
its ( :vendor
|
|
34
|
-
its ( :data
|
|
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
35
|
end
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
describe Vendor,
|
|
39
|
-
subject { Vendor.new(
|
|
40
|
-
it_should_behave_like
|
|
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
41
|
end
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
describe Vendor,
|
|
45
|
-
subject { Vendor.new(
|
|
46
|
-
it_should_behave_like
|
|
44
|
+
describe Vendor, '.new(:xid => value)' do
|
|
45
|
+
subject { Vendor.new(:xid => xid) }
|
|
46
|
+
it_should_behave_like 'any Openflow message with xid'
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
describe Vendor,
|
|
51
|
-
subject { Vendor.new(
|
|
52
|
-
let(
|
|
53
|
-
its(
|
|
54
|
-
its ( :data
|
|
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
55
|
end
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
describe Vendor,
|
|
59
|
-
subject { Vendor.new(
|
|
60
|
-
let(
|
|
61
|
-
its(
|
|
62
|
-
its ( :vendor
|
|
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
63
|
end
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
describe Vendor, '.new("INVALID OPTION")', :nosudo => true do
|
|
67
|
-
it { expect { Vendor.new
|
|
67
|
+
it { expect { Vendor.new 'INVALID OPTION' }.to raise_error(TypeError) }
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
70
|
|
data/spec/trema_spec.rb
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class CbenchSwitch < Controller
|
|
22
|
-
def packet_in
|
|
22
|
+
def packet_in(datapath_id, message)
|
|
23
23
|
send_flow_mod_add(
|
|
24
24
|
datapath_id,
|
|
25
25
|
:cookie => 0,
|
|
26
|
-
:match => ExactMatch.from(
|
|
26
|
+
:match => ExactMatch.from(message),
|
|
27
27
|
:buffer_id => message.buffer_id,
|
|
28
|
-
:actions => ActionOutput.new(
|
|
28
|
+
:actions => ActionOutput.new(:port => message.in_port + 1)
|
|
29
29
|
)
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
# Openflow message event dumper.
|
|
21
21
|
#
|
|
22
22
|
class Dumper < Controller
|
|
23
|
-
def switch_ready
|
|
24
|
-
info
|
|
23
|
+
def switch_ready(datapath_id)
|
|
24
|
+
info '[switch_ready]'
|
|
25
25
|
info " datapath_id: #{ datapath_id.to_hex }"
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def switch_disconnected
|
|
30
|
-
info
|
|
29
|
+
def switch_disconnected(datapath_id)
|
|
30
|
+
info '[switch_disconnected]'
|
|
31
31
|
info " datapath_id: #{ datapath_id.to_hex }"
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
def openflow_error
|
|
36
|
-
info
|
|
35
|
+
def openflow_error(datapath_id, message)
|
|
36
|
+
info '[error]'
|
|
37
37
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
38
38
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
39
39
|
info "type: #{ message.type.to_hex }"
|
|
@@ -42,17 +42,17 @@ class Dumper < Controller
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
def vendor
|
|
46
|
-
info
|
|
45
|
+
def vendor(datapath_id, message)
|
|
46
|
+
info '[vendor]'
|
|
47
47
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
48
48
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
49
|
-
info
|
|
49
|
+
info 'data:'
|
|
50
50
|
info "#{ message.buffer.unpack "H*" }"
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
def features_reply
|
|
55
|
-
info
|
|
54
|
+
def features_reply(datapath_id, message)
|
|
55
|
+
info '[features_reply]'
|
|
56
56
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
57
57
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
58
58
|
info "n_buffers: #{ message.n_buffers }"
|
|
@@ -65,8 +65,8 @@ class Dumper < Controller
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def get_config_reply
|
|
69
|
-
info
|
|
68
|
+
def get_config_reply(datapath_id, message)
|
|
69
|
+
info '[get_config_reply]'
|
|
70
70
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
71
71
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
72
72
|
info "flags: #{ message.flags.to_hex }"
|
|
@@ -74,8 +74,8 @@ class Dumper < Controller
|
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
def packet_in
|
|
78
|
-
info
|
|
77
|
+
def packet_in(datapath_id, message)
|
|
78
|
+
info '[packet_in]'
|
|
79
79
|
info " datapath_id: #{ datapath_id.to_hex }"
|
|
80
80
|
info " transaction_id: #{ message.transaction_id.to_hex }"
|
|
81
81
|
info " buffer_id: #{ message.buffer_id.to_hex }"
|
|
@@ -86,12 +86,12 @@ class Dumper < Controller
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def flow_removed
|
|
90
|
-
info
|
|
89
|
+
def flow_removed(datapath_id, message)
|
|
90
|
+
info '[flow_removed]'
|
|
91
91
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
92
92
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
93
93
|
|
|
94
|
-
info
|
|
94
|
+
info 'match:'
|
|
95
95
|
info " wildcards: #{ message.match.wildcards.to_hex }"
|
|
96
96
|
info " in_port: #{ message.match.in_port }"
|
|
97
97
|
info " dl_src: #{ message.match.dl_src }"
|
|
@@ -117,8 +117,8 @@ class Dumper < Controller
|
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
def port_status
|
|
121
|
-
info
|
|
120
|
+
def port_status(datapath_id, message)
|
|
121
|
+
info '[port_status]'
|
|
122
122
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
123
123
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
124
124
|
info "reason: #{ message.reason.to_hex }"
|
|
@@ -126,8 +126,8 @@ class Dumper < Controller
|
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
|
|
129
|
-
def stats_reply
|
|
130
|
-
info
|
|
129
|
+
def stats_reply(datapath_id, message)
|
|
130
|
+
info '[stats_reply]'
|
|
131
131
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
132
132
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
133
133
|
info "type: #{ message.type.to_hex }"
|
|
@@ -136,19 +136,19 @@ class Dumper < Controller
|
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
|
|
139
|
-
def barrier_reply
|
|
140
|
-
info
|
|
139
|
+
def barrier_reply(datapath_id, message)
|
|
140
|
+
info '[barrier_reply]'
|
|
141
141
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
142
142
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
def queue_get_config_reply
|
|
147
|
-
info
|
|
146
|
+
def queue_get_config_reply(datapath_id, message)
|
|
147
|
+
info '[queue_get_config_reply]'
|
|
148
148
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
149
149
|
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
150
150
|
info "port: #{ message.port }"
|
|
151
|
-
info(
|
|
151
|
+
info('queues:');
|
|
152
152
|
dump_packet_queue message.queues
|
|
153
153
|
end
|
|
154
154
|
|
|
@@ -158,7 +158,7 @@ class Dumper < Controller
|
|
|
158
158
|
##############################################################################
|
|
159
159
|
|
|
160
160
|
|
|
161
|
-
def dump_phy_port
|
|
161
|
+
def dump_phy_port(port)
|
|
162
162
|
# for testing port-status record the mac address if port.number == 2.
|
|
163
163
|
@hw_addr = port.hw_addr if port.number == 2
|
|
164
164
|
info "port_no: #{ port.number }"
|
|
@@ -173,15 +173,15 @@ class Dumper < Controller
|
|
|
173
173
|
end
|
|
174
174
|
|
|
175
175
|
|
|
176
|
-
def dump_packet_queue
|
|
176
|
+
def dump_packet_queue(queues)
|
|
177
177
|
queues.each do | packet_queue |
|
|
178
178
|
info "queue_id: #{ packet_queue.queue_id.to_hex }"
|
|
179
179
|
info " len: #{ packet_queue.len }"
|
|
180
|
-
info
|
|
180
|
+
info ' properties:'
|
|
181
181
|
packet_queue.properties.each do | prop |
|
|
182
182
|
info " property: #{ prop.property.to_hex }"
|
|
183
183
|
info " len: #{ prop.len.to_hex }"
|
|
184
|
-
info
|
|
184
|
+
info ' rate: %u' % prop.rate if prop.property == PacketQueue::OFPQT_MIN_RATE
|
|
185
185
|
end
|
|
186
186
|
end
|
|
187
187
|
end
|
|
@@ -28,18 +28,18 @@ class ForwardingEntry
|
|
|
28
28
|
attr_writer :age_max
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
def initialize
|
|
31
|
+
def initialize(mac, port_no, age_max, dpid)
|
|
32
32
|
@mac = mac
|
|
33
33
|
@port_no = port_no
|
|
34
34
|
@age_max = age_max
|
|
35
35
|
@dpid = dpid
|
|
36
36
|
@last_update = Time.now
|
|
37
|
-
debug "New entry: MAC address = #{ @mac
|
|
37
|
+
debug "New entry: MAC address = #{ @mac }, port number = #{ @port_no }"
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def update
|
|
42
|
-
debug "Update: The port number of #{ @mac
|
|
41
|
+
def update(port_no)
|
|
42
|
+
debug "Update: The port number of #{ @mac } has been changed #{ @port_no } => #{ port_no }"
|
|
43
43
|
@port_no = port_no
|
|
44
44
|
@last_update = Time.now
|
|
45
45
|
end
|
|
@@ -47,7 +47,7 @@ class ForwardingEntry
|
|
|
47
47
|
|
|
48
48
|
def aged_out?
|
|
49
49
|
aged_out = Time.now - @last_update > @age_max
|
|
50
|
-
debug "Age out: An entry (MAC address = #{ @mac
|
|
50
|
+
debug "Age out: An entry (MAC address = #{ @mac }, port number = #{ @port_no }) has been aged-out" if aged_out
|
|
51
51
|
aged_out
|
|
52
52
|
end
|
|
53
53
|
end
|
|
@@ -65,8 +65,8 @@ class FDB
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def port_no_of
|
|
69
|
-
dest = @db[ mac
|
|
68
|
+
def port_no_of(mac)
|
|
69
|
+
dest = @db[ mac]
|
|
70
70
|
if dest
|
|
71
71
|
dest.port_no
|
|
72
72
|
else
|
|
@@ -75,22 +75,22 @@ class FDB
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
|
|
78
|
-
def lookup
|
|
79
|
-
if dest = @db[ mac
|
|
80
|
-
[
|
|
78
|
+
def lookup(mac)
|
|
79
|
+
if dest = @db[ mac]
|
|
80
|
+
[dest.dpid, dest.port_no]
|
|
81
81
|
else
|
|
82
82
|
nil
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def learn
|
|
88
|
-
entry = @db[ mac
|
|
87
|
+
def learn(mac, port_no, dpid = nil)
|
|
88
|
+
entry = @db[ mac]
|
|
89
89
|
if entry
|
|
90
90
|
entry.update port_no
|
|
91
91
|
else
|
|
92
|
-
new_entry = ForwardingEntry.new(
|
|
93
|
-
@db[ new_entry.mac
|
|
92
|
+
new_entry = ForwardingEntry.new(mac, port_no, DEFAULT_AGE_MAX, dpid)
|
|
93
|
+
@db[ new_entry.mac] = new_entry
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
96
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
#
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
require
|
|
21
|
+
require 'fdb'
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
#
|
|
@@ -33,11 +33,11 @@ class LearningSwitch < Controller
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
def packet_in
|
|
36
|
+
def packet_in(datapath_id, message)
|
|
37
37
|
return if message.macda.reserved?
|
|
38
38
|
|
|
39
39
|
@fdb.learn message.macsa, message.in_port
|
|
40
|
-
port_no = @fdb.port_no_of(
|
|
40
|
+
port_no = @fdb.port_no_of(message.macda)
|
|
41
41
|
if port_no
|
|
42
42
|
flow_mod datapath_id, message, port_no
|
|
43
43
|
packet_out datapath_id, message, port_no
|
|
@@ -57,25 +57,27 @@ class LearningSwitch < Controller
|
|
|
57
57
|
##############################################################################
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def flow_mod
|
|
60
|
+
def flow_mod(datapath_id, message, port_no)
|
|
61
61
|
send_flow_mod_add(
|
|
62
62
|
datapath_id,
|
|
63
|
-
:match => ExactMatch.from(
|
|
64
|
-
:actions => ActionOutput.new(
|
|
63
|
+
:match => ExactMatch.from(message),
|
|
64
|
+
:actions => ActionOutput.new(:port => port_no)
|
|
65
65
|
)
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
def packet_out
|
|
69
|
+
def packet_out(datapath_id, message, port_no)
|
|
70
70
|
send_packet_out(
|
|
71
71
|
datapath_id,
|
|
72
|
-
:
|
|
73
|
-
:
|
|
72
|
+
:in_port => message.in_port,
|
|
73
|
+
:buffer_id => 0xffffffff,
|
|
74
|
+
:data => message.data,
|
|
75
|
+
:actions => ActionOutput.new(:port => port_no)
|
|
74
76
|
)
|
|
75
77
|
end
|
|
76
78
|
|
|
77
79
|
|
|
78
|
-
def flood
|
|
80
|
+
def flood(datapath_id, message)
|
|
79
81
|
packet_out datapath_id, message, OFPP_FLOOD
|
|
80
82
|
end
|
|
81
83
|
end
|