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: Yasuhito Takamiya <yasuhito@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,30 +20,66 @@ require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
|
22
20
|
require "trema"
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
23
|
+
module Trema
|
|
24
|
+
describe FeaturesReply, ".new" do
|
|
25
|
+
it { expect { subject }.to raise_error( ArgumentError ) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
describe FeaturesReply, ".new(options...)" do
|
|
30
|
+
subject {
|
|
31
|
+
valid_options = {
|
|
32
|
+
:datapath_id => 123,
|
|
33
|
+
:transaction_id => 1234,
|
|
34
|
+
:n_buffers => 256,
|
|
35
|
+
:n_tables => 2,
|
|
36
|
+
:capabilities => 135,
|
|
37
|
+
:actions => 2047,
|
|
38
|
+
:ports => [ "port #0", "port #1", "port #2" ]
|
|
39
|
+
}
|
|
40
|
+
FeaturesReply.new( valid_options )
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
its( :datapath_id ) { should == 123 }
|
|
44
|
+
its( :transaction_id ) { should == 1234 }
|
|
45
|
+
its( :xid ) { should == 1234 }
|
|
46
|
+
its( :n_buffers ) { should == 256 }
|
|
47
|
+
its( :n_tables ) { should == 2 }
|
|
48
|
+
its( :capabilities ) { should == 135 }
|
|
49
|
+
its( :actions ) { should == 2047 }
|
|
50
|
+
its( :ports ) { subject.size.should == 3 }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
describe FeaturesReply, ".new(options...) (No :datapath_id)" do
|
|
55
|
+
subject {
|
|
56
|
+
FeaturesReply.new( {
|
|
57
|
+
# :datapath_id => 123,
|
|
58
|
+
:transaction_id => 1234,
|
|
59
|
+
:n_buffers => 256,
|
|
60
|
+
:n_tables => 2,
|
|
61
|
+
:capabilities => 135,
|
|
62
|
+
:actions => 2047,
|
|
63
|
+
:ports => [ "port #0", "port #1", "port #2" ]
|
|
64
|
+
} )
|
|
65
|
+
}
|
|
66
|
+
it { expect { subject }.to raise_error( ArgumentError, ":datapath_id is a mandatory option" ) }
|
|
67
|
+
end
|
|
44
68
|
|
|
45
69
|
|
|
46
|
-
describe FeaturesReply, ".new(
|
|
47
|
-
|
|
48
|
-
|
|
70
|
+
describe FeaturesReply, ".new(options...) (No :transaction_id)" do
|
|
71
|
+
subject {
|
|
72
|
+
FeaturesReply.new( {
|
|
73
|
+
:datapath_id => 123,
|
|
74
|
+
# :transaction_id => 1234,
|
|
75
|
+
:n_buffers => 256,
|
|
76
|
+
:n_tables => 2,
|
|
77
|
+
:capabilities => 135,
|
|
78
|
+
:actions => 2047,
|
|
79
|
+
:ports => [ "port #0", "port #1", "port #2" ]
|
|
80
|
+
} )
|
|
81
|
+
}
|
|
82
|
+
it { expect { subject }.to raise_error( ArgumentError, ":transaction_id is a mandatory option" ) }
|
|
49
83
|
end
|
|
50
84
|
end
|
|
51
85
|
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Author: Yasuhito Takamiya <yasuhito@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,39 +20,67 @@ require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
|
22
20
|
require "trema"
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
shared_examples_for "features request message" do
|
|
24
|
+
class FeaturesRequestController < Controller; end
|
|
25
|
+
|
|
26
|
+
it "should be logged to the switch's log", :sudo => true do
|
|
27
|
+
network {
|
|
28
|
+
vswitch( "features-request" ) { datapath_id 0xabc }
|
|
29
|
+
}.run( FeaturesRequestController ) {
|
|
30
|
+
controller( "FeaturesRequestController" ).send_message( 0xabc, subject )
|
|
31
|
+
IO.read( File.join( Trema.log, "openflowd.features-request.log" ) ).should include( "OFPT_FEATURES_REQUEST" )
|
|
32
|
+
}
|
|
33
|
+
end
|
|
27
34
|
end
|
|
28
35
|
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
module Trema
|
|
38
|
+
describe FeaturesRequest, ".new" do
|
|
39
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
40
|
+
it_should_behave_like "features request message"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
describe FeaturesRequest, ".new(nil)" do
|
|
45
|
+
subject { FeaturesRequest.new( nil ) }
|
|
46
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
47
|
+
it_should_behave_like "features request message"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
describe FeaturesRequest, ".new(transaction_id)" do
|
|
52
|
+
subject { FeaturesRequest.new( transaction_id ) }
|
|
53
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
54
|
+
context "when sent to a switch" do
|
|
55
|
+
let( :transaction_id ) { 123 }
|
|
56
|
+
it_should_behave_like "features request message"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
describe FeaturesRequest, ".new(:transaction_id => value)" do
|
|
62
|
+
subject { FeaturesRequest.new( :transaction_id => transaction_id ) }
|
|
63
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
64
|
+
context "when sent to a switch" do
|
|
65
|
+
let( :transaction_id ) { 123 }
|
|
66
|
+
it_should_behave_like "features request message"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
describe FeaturesRequest, ".new(:xid => value)" do
|
|
72
|
+
subject { FeaturesRequest.new( :xid => xid ) }
|
|
73
|
+
it_should_behave_like "any Openflow message with xid"
|
|
74
|
+
|
|
75
|
+
context "when sent to a switch" do
|
|
76
|
+
let( :xid ) { 123 }
|
|
77
|
+
it_should_behave_like "features request message"
|
|
48
78
|
end
|
|
49
79
|
end
|
|
50
|
-
end
|
|
51
80
|
|
|
52
81
|
|
|
53
|
-
describe FeaturesRequest,
|
|
54
|
-
|
|
55
|
-
expect {
|
|
56
|
-
FeaturesRequest.new "INVALID_OPTION"
|
|
57
|
-
}.to raise_error( TypeError )
|
|
82
|
+
describe FeaturesRequest, '.new("INVALID OPTION")', :nosudo => true do
|
|
83
|
+
it { expect { FeaturesRequest.new "INVALID OPTION" }.to raise_error( TypeError ) }
|
|
58
84
|
end
|
|
59
85
|
end
|
|
60
86
|
|
|
@@ -0,0 +1,99 @@
|
|
|
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 FlowMod, ".new", :nosudo => true do
|
|
25
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
describe FlowMod, ".new(nil)", :nosudo => true do
|
|
30
|
+
subject { FlowMod.new( nil ) }
|
|
31
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
describe FlowMod, ".new(transaction_id)", :nosudo => true do
|
|
36
|
+
subject { FlowMod.new( transaction_id ) }
|
|
37
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
describe FlowMod, ".new(:transaction_id => value)", :nosudo => true do
|
|
42
|
+
subject { FlowMod.new( :transaction_id => transaction_id ) }
|
|
43
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
describe FlowMod, ".new(:xid => value)", :nosudo => true do
|
|
48
|
+
subject { FlowMod.new( :xid => xid ) }
|
|
49
|
+
it_should_behave_like "any Openflow message with xid"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
describe FlowMod, ".new(:command => value)", :nosudo => true do
|
|
54
|
+
subject { FlowMod.new( :command => command ) }
|
|
55
|
+
|
|
56
|
+
context "command: 0", :nosudo => true do
|
|
57
|
+
let( :command ) { 0 }
|
|
58
|
+
its( :command ) { should == 0 }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# TODO: boundary test.
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
describe FlowMod, ".new(:idle_timeout => value)", :nosudo => true do
|
|
66
|
+
subject { FlowMod.new( :idle_timeout => idle_timeout ) }
|
|
67
|
+
|
|
68
|
+
context "idle_timeout: 0", :nosudo => true do
|
|
69
|
+
let( :idle_timeout ) { 0 }
|
|
70
|
+
its( :idle_timeout ) { should == 0 }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# TODO: boundary test.
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
describe FlowMod, ".new(:hard_timeout => value)", :nosudo => true do
|
|
78
|
+
subject { FlowMod.new( :hard_timeout => hard_timeout ) }
|
|
79
|
+
|
|
80
|
+
context "hard_timeout: 0", :nosudo => true do
|
|
81
|
+
let( :hard_timeout ) { 0 }
|
|
82
|
+
its( :hard_timeout ) { should == 0 }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# TODO: boundary test.
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
describe FlowMod, '.new("INVALID OPTION")', :nosudo => true do
|
|
90
|
+
it { expect { FlowMod.new "INVALID OPTION" }.to raise_error( TypeError ) }
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
### Local variables:
|
|
96
|
+
### mode: Ruby
|
|
97
|
+
### coding: utf-8-unix
|
|
98
|
+
### indent-tabs-mode: nil
|
|
99
|
+
### End:
|
|
@@ -20,15 +20,15 @@
|
|
|
20
20
|
|
|
21
21
|
require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
22
22
|
require "trema/dsl/switch"
|
|
23
|
-
require "trema/
|
|
23
|
+
require "trema/hardware-switch"
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
module Trema
|
|
27
|
-
describe
|
|
27
|
+
describe HardwareSwitch, %[dpid = "0xabc"] do
|
|
28
28
|
before :each do
|
|
29
29
|
stanza = DSL::Switch.new
|
|
30
30
|
stanza.dpid "0xabc"
|
|
31
|
-
@switch =
|
|
31
|
+
@switch = HardwareSwitch.new( stanza )
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
|
data/spec/trema/hello_spec.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Author: Yasuhito Takamiya <yasuhito@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,22 +20,38 @@ require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
|
|
|
22
20
|
require "trema"
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
module Trema
|
|
24
|
+
describe Hello, ".new", :nosudo => true do
|
|
25
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
26
|
+
end
|
|
28
27
|
|
|
29
28
|
|
|
30
|
-
describe Hello, ".new(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
end
|
|
29
|
+
describe Hello, ".new(nil)", :nosudo => true do
|
|
30
|
+
subject { Hello.new( nil ) }
|
|
31
|
+
it_should_behave_like "any Openflow message with default transaction ID"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
describe Hello, ".new(transaction_id)", :nosudo => true do
|
|
36
|
+
subject { Hello.new( transaction_id ) }
|
|
37
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
describe Hello, ".new(:transaction_id => value)", :nosudo => true do
|
|
42
|
+
subject { Hello.new( :transaction_id => transaction_id ) }
|
|
43
|
+
it_should_behave_like "any Openflow message with transaction ID"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
describe Hello, ".new(:xid => value)", :nosudo => true do
|
|
48
|
+
subject { Hello.new( :xid => xid ) }
|
|
49
|
+
it_should_behave_like "any Openflow message with xid"
|
|
50
|
+
end
|
|
34
51
|
|
|
35
52
|
|
|
36
|
-
describe Hello,
|
|
37
|
-
|
|
38
|
-
expect {
|
|
39
|
-
Hello.new "INVALID OPTIONS"
|
|
40
|
-
}.to raise_error( TypeError )
|
|
53
|
+
describe Hello, '.new("INVALID OPTION")', :nosudo => true do
|
|
54
|
+
it { expect { Hello.new "INVALID OPTION" }.to raise_error( TypeError ) }
|
|
41
55
|
end
|
|
42
56
|
end
|
|
43
57
|
|
|
@@ -0,0 +1,54 @@
|
|
|
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/ip"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module Trema
|
|
24
|
+
describe IP do
|
|
25
|
+
context "when creating" do
|
|
26
|
+
subject { IP.new( ip_address, prefixlen ) }
|
|
27
|
+
|
|
28
|
+
context %{when "192.168.1.1/32"} do
|
|
29
|
+
let( :ip_address ) { "192.168.1.1" }
|
|
30
|
+
let( :prefixlen ) { 32 }
|
|
31
|
+
|
|
32
|
+
its( :to_s ) { should == "192.168.1.1" }
|
|
33
|
+
its( :to_i ) { should == 3232235777 }
|
|
34
|
+
its( :to_a ) { should == [ 0xc0, 0xa8, 0x01, 0x01 ] }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context %{when "10.1.1.1/8"} do
|
|
38
|
+
let( :ip_address ) { "10.1.1.1" }
|
|
39
|
+
let( :prefixlen ) { 8 }
|
|
40
|
+
|
|
41
|
+
its( :to_s ) { should == "10.0.0.0" }
|
|
42
|
+
its( :to_i ) { should == 10 * 256 * 256 * 256 }
|
|
43
|
+
its( :to_a ) { should == [ 0x0a, 0x00, 0x00, 0x00 ] }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
### Local variables:
|
|
51
|
+
### mode: Ruby
|
|
52
|
+
### coding: utf-8-unix
|
|
53
|
+
### indent-tabs-mode: nil
|
|
54
|
+
### End:
|
data/spec/trema/mac_spec.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Author: Yasuhito Takamiya <yasuhito@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
|
|
@@ -23,82 +21,69 @@ require "trema/mac"
|
|
|
23
21
|
|
|
24
22
|
|
|
25
23
|
module Trema
|
|
26
|
-
describe Mac do
|
|
27
|
-
|
|
28
|
-
context %{when "INVALID MAC ADDRESS" } do
|
|
29
|
-
it "should raise an error" do
|
|
30
|
-
lambda do
|
|
31
|
-
Mac.new( "INVALID MAC ADDRESS" )
|
|
32
|
-
end.should raise_error( %{Invalid MAC address: "INVALID MAC ADDRESS"} )
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
context "when -1" do
|
|
38
|
-
it "should raise an error" do
|
|
39
|
-
lambda do
|
|
40
|
-
Mac.new( -1 )
|
|
41
|
-
end.should raise_error( "Invalid MAC address: -1" )
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
24
|
+
describe Mac, ".new(invalid_value)" do
|
|
25
|
+
subject { Mac.new( value ) }
|
|
45
26
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
Mac.new( 0x1000000000000 )
|
|
50
|
-
end.should raise_error( "Invalid MAC address: #{ 0x1000000000000 }" )
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
context %{when "[ 1, 2, 3 ]" } do
|
|
56
|
-
it "should raise an error" do
|
|
57
|
-
lambda do
|
|
58
|
-
Mac.new( [ 1, 2, 3 ] )
|
|
59
|
-
end.should raise_error( "Invalid MAC address: [1, 2, 3]" )
|
|
60
|
-
end
|
|
61
|
-
end
|
|
27
|
+
context %{when "INVALID MAC ADDRESS"} do
|
|
28
|
+
let( :value ) { "INVALID MAC ADDRESS" }
|
|
29
|
+
it { expect { subject }.to raise_error( ArgumentError ) }
|
|
62
30
|
end
|
|
63
31
|
|
|
32
|
+
context "when -1" do
|
|
33
|
+
let( :value ) { -1 }
|
|
34
|
+
it { expect { subject }.to raise_error( ArgumentError ) }
|
|
35
|
+
end
|
|
64
36
|
|
|
65
|
-
context "when
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
context %{when "11:22:33:44:55:66"} do
|
|
70
|
-
let( :mac_address ) { "11:22:33:44:55:66" }
|
|
71
|
-
|
|
72
|
-
it { should == Mac.new( "11:22:33:44:55:66" ) }
|
|
73
|
-
its( :value ) { should == 0x112233445566 }
|
|
74
|
-
its( :to_s ) { should == "11:22:33:44:55:66" }
|
|
75
|
-
its( :to_short ) { should == [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ] }
|
|
76
|
-
end
|
|
37
|
+
context "when 0x1000000000000" do
|
|
38
|
+
let( :value ) { 0x1000000000000 }
|
|
39
|
+
it { expect { subject }.to raise_error( ArgumentError ) }
|
|
40
|
+
end
|
|
77
41
|
|
|
42
|
+
context "when [ 1, 2, 3 ]" do
|
|
43
|
+
let( :value ) { [ 1, 2, 3 ] }
|
|
44
|
+
it { expect { subject }.to raise_error( TypeError ) }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
78
47
|
|
|
79
|
-
context "when 0" do
|
|
80
|
-
let( :mac_address ) { 0 }
|
|
81
48
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
its( :to_s ) { should == "00:00:00:00:00:00" }
|
|
85
|
-
its( :to_short ) { should == [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] }
|
|
86
|
-
end
|
|
49
|
+
describe Mac, ".new(value)" do
|
|
50
|
+
subject { Mac.new( value ) }
|
|
87
51
|
|
|
52
|
+
context %{when "11:22:33:44:55:66"} do
|
|
53
|
+
let( :value ) { "11:22:33:44:55:66" }
|
|
54
|
+
it { should == Mac.new( "11:22:33:44:55:66" ) }
|
|
55
|
+
its( :value ) { should == 0x112233445566 }
|
|
56
|
+
its( :to_s ) { should == "11:22:33:44:55:66" }
|
|
57
|
+
its( :to_a ) { should == [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ] }
|
|
58
|
+
its( :multicast? ){ should be_true }
|
|
59
|
+
its( :broadcast? ){ should be_false }
|
|
60
|
+
end
|
|
88
61
|
|
|
89
|
-
|
|
90
|
-
|
|
62
|
+
context "when 0" do
|
|
63
|
+
let( :value ) { 0 }
|
|
64
|
+
it { should == Mac.new( 0 ) }
|
|
65
|
+
its( :value ) { should == 0 }
|
|
66
|
+
its( :to_s ) { should == "00:00:00:00:00:00" }
|
|
67
|
+
its( :to_a ) { should == [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] }
|
|
68
|
+
its( :multicast? ){ should be_false }
|
|
69
|
+
its( :broadcast? ){ should be_false }
|
|
70
|
+
end
|
|
91
71
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
72
|
+
context "when 0xffffffffffff" do
|
|
73
|
+
let( :value ) { 0xffffffffffff }
|
|
74
|
+
it { should == Mac.new( 0xffffffffffff ) }
|
|
75
|
+
its( :value ) { should == 0xffffffffffff }
|
|
76
|
+
its( :to_s ) { should == "ff:ff:ff:ff:ff:ff" }
|
|
77
|
+
its( :to_a ) { should == [ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ] }
|
|
78
|
+
its( :multicast? ){ should be_true }
|
|
79
|
+
its( :broadcast? ){ should be_true }
|
|
97
80
|
end
|
|
81
|
+
end
|
|
98
82
|
|
|
99
83
|
|
|
84
|
+
describe Mac do
|
|
100
85
|
context "when querying FDB" do
|
|
101
|
-
it "
|
|
86
|
+
it "can be used for Hash keys" do
|
|
102
87
|
fdb = {}
|
|
103
88
|
fdb[ Mac.new( "00:00:00:00:00:01" ) ] = "Port #1"
|
|
104
89
|
fdb[ Mac.new( "00:00:00:00:00:01" ) ].should == "Port #1"
|