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.
Files changed (250) hide show
  1. data/.gitmodules +3 -0
  2. data/.travis.yml +13 -0
  3. data/.yardopts +4 -0
  4. data/Gemfile +2 -3
  5. data/README.md +43 -97
  6. data/Rakefile +60 -4
  7. data/Rantfile +11 -10
  8. data/cruise.rb +4 -6
  9. data/features/example.packetin_filter_config.feature +10 -10
  10. data/features/example.switch_monitor.feature +14 -2
  11. data/features/step_definitions/kill_steps.rb +2 -2
  12. data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
  13. data/features/step_definitions/misc_steps.rb +1 -1
  14. data/features/step_definitions/up_steps.rb +30 -0
  15. data/features/trema.feature +1 -0
  16. data/features/trema.run.feature +1 -0
  17. data/locale/README.ja.md +19 -0
  18. data/locale/ja/yard.po +3762 -0
  19. data/locale/yard.pot +3740 -0
  20. data/ruby/extconf.rb +4 -1
  21. data/ruby/trema/action-common.c +3 -17
  22. data/ruby/trema/action-common.h +3 -7
  23. data/ruby/trema/action.rb +33 -0
  24. data/ruby/trema/app.rb +1 -1
  25. data/ruby/trema/barrier-request.c +1 -0
  26. data/ruby/trema/command/run.rb +13 -9
  27. data/ruby/trema/command/usage.rb +1 -0
  28. data/ruby/trema/command/version.rb +1 -1
  29. data/ruby/trema/controller.c +133 -50
  30. data/ruby/trema/controller.rb +2 -2
  31. data/ruby/trema/desc-stats-reply.rb +77 -0
  32. data/ruby/trema/dsl/configuration.rb +3 -14
  33. data/ruby/trema/dsl/rswitch.rb +47 -0
  34. data/ruby/trema/dsl/runner.rb +4 -1
  35. data/ruby/trema/dsl/syntax.rb +11 -8
  36. data/ruby/trema/echo-reply.c +59 -45
  37. data/ruby/trema/echo-reply.h +1 -3
  38. data/ruby/trema/echo-request.c +49 -71
  39. data/ruby/trema/echo-request.h +0 -2
  40. data/ruby/trema/echo.c +99 -0
  41. data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
  42. data/ruby/trema/enqueue.rb +87 -0
  43. data/ruby/trema/error.c +109 -104
  44. data/ruby/trema/error.h +0 -2
  45. data/ruby/trema/features-reply.c +89 -35
  46. data/ruby/trema/features-reply.h +0 -6
  47. data/ruby/trema/features-request.c +63 -37
  48. data/ruby/trema/features-request.h +0 -2
  49. data/ruby/trema/flow-mod.c +149 -0
  50. data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
  51. data/ruby/trema/get-config-request.c +1 -0
  52. data/ruby/trema/hardware-switch.rb +88 -0
  53. data/ruby/trema/hello.c +55 -31
  54. data/ruby/trema/hello.h +0 -2
  55. data/ruby/trema/ip.rb +12 -2
  56. data/ruby/trema/logger.rb +29 -0
  57. data/ruby/trema/mac.rb +57 -36
  58. data/ruby/trema/match.c +7 -9
  59. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
  60. data/ruby/trema/network-component.rb +1 -1
  61. data/ruby/trema/open-vswitch.rb +2 -2
  62. data/ruby/trema/openflow-switch.rb +3 -54
  63. data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
  64. data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
  65. data/ruby/trema/packet-queue.rb +4 -3
  66. data/ruby/trema/port-mod.c +8 -9
  67. data/ruby/trema/port-status-add.rb +60 -0
  68. data/ruby/trema/port-status-delete.rb +60 -0
  69. data/ruby/trema/port-status-modify.rb +60 -0
  70. data/ruby/trema/port-status.c +48 -15
  71. data/ruby/trema/port-status.h +6 -8
  72. data/ruby/trema/port.c +63 -8
  73. data/ruby/trema/queue-get-config-request.c +1 -0
  74. data/ruby/trema/ruby-switch.rb +62 -0
  75. data/ruby/trema/send-out-port.rb +97 -0
  76. data/ruby/trema/set-config.c +1 -0
  77. data/ruby/trema/set-eth-addr.rb +45 -0
  78. data/ruby/trema/set-eth-dst-addr.rb +54 -0
  79. data/ruby/trema/set-eth-src-addr.rb +54 -0
  80. data/ruby/trema/set-ip-addr.rb +47 -0
  81. data/ruby/trema/set-ip-dst-addr.rb +53 -0
  82. data/ruby/trema/set-ip-src-addr.rb +52 -0
  83. data/ruby/trema/set-ip-tos.rb +63 -0
  84. data/ruby/trema/set-transport-dst-port.rb +53 -0
  85. data/ruby/trema/set-transport-port.rb +52 -0
  86. data/ruby/trema/set-transport-src-port.rb +54 -0
  87. data/ruby/trema/set-vlan-priority.rb +65 -0
  88. data/ruby/trema/set-vlan-vid.rb +64 -0
  89. data/ruby/trema/shell/down.rb +1 -1
  90. data/ruby/trema/shell/link.rb +4 -4
  91. data/ruby/trema/shell/run.rb +8 -6
  92. data/ruby/trema/shell/up.rb +3 -3
  93. data/ruby/trema/stats-reply.c +27 -2
  94. data/ruby/trema/stats-request.c +64 -23
  95. data/ruby/trema/strip-vlan-header.rb +41 -0
  96. data/ruby/trema/switch.c +196 -0
  97. data/ruby/trema/{action-vendor.h → switch.h} +5 -7
  98. data/ruby/trema/switch.rb +28 -9
  99. data/ruby/trema/trema-ruby-utils.c +66 -0
  100. data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
  101. data/ruby/trema/trema.c +61 -61
  102. data/ruby/trema/vendor-action.rb +73 -0
  103. data/ruby/trema/vendor.c +121 -52
  104. data/ruby/trema/vendor.h +6 -10
  105. data/ruby/trema/version.rb +1 -1
  106. data/spec/spec_helper.rb +1 -1
  107. data/spec/support/action.rb +52 -0
  108. data/spec/support/mandatory-option.rb +56 -0
  109. data/spec/support/openflow-message.rb +91 -7
  110. data/spec/support/port-status.rb +38 -0
  111. data/spec/trema/controller_spec.rb +0 -26
  112. data/spec/trema/dsl/configuration_spec.rb +3 -3
  113. data/spec/trema/dsl/runner_spec.rb +12 -32
  114. data/spec/trema/dsl/syntax_spec.rb +2 -11
  115. data/spec/trema/echo-reply_spec.rb +49 -14
  116. data/spec/trema/echo-request_spec.rb +86 -34
  117. data/spec/trema/enqueue_spec.rb +76 -0
  118. data/spec/trema/error_spec.rb +43 -58
  119. data/spec/trema/features-reply_spec.rb +58 -24
  120. data/spec/trema/features-request_spec.rb +54 -28
  121. data/spec/trema/flow-mod_spec.rb +99 -0
  122. data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
  123. data/spec/trema/hello_spec.rb +28 -14
  124. data/spec/trema/ip_spec.rb +54 -0
  125. data/spec/trema/mac_spec.rb +49 -64
  126. data/spec/trema/match_spec.rb +1 -1
  127. data/spec/trema/open-vswitch_spec.rb +7 -7
  128. data/spec/trema/packet-in_spec.rb +73 -16
  129. data/spec/trema/port-status-add_spec.rb +32 -0
  130. data/spec/trema/port-status-delete_spec.rb +32 -0
  131. data/spec/trema/port-status-modify_spec.rb +71 -0
  132. data/spec/trema/port-status_spec.rb +5 -76
  133. data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
  134. data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
  135. data/spec/trema/set-eth-src-addr_spec.rb +72 -0
  136. data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
  137. data/spec/trema/set-ip-src-addr_spec.rb +58 -0
  138. data/spec/trema/set-ip-tos_spec.rb +65 -0
  139. data/spec/trema/set-transport-dst-port_spec.rb +65 -0
  140. data/spec/trema/set-transport-src-port_spec.rb +65 -0
  141. data/spec/trema/set-vlan-priority_spec.rb +65 -0
  142. data/spec/trema/set-vlan-vid_spec.rb +65 -0
  143. data/spec/trema/shell/vhost_spec.rb +4 -1
  144. data/spec/trema/shell/vswitch_spec.rb +11 -11
  145. data/spec/trema/stats-reply_spec.rb +59 -13
  146. data/spec/trema/stats-request_spec.rb +6 -0
  147. data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
  148. data/spec/trema/switch-daemon_spec.rb +39 -0
  149. data/spec/trema/vendor-action_spec.rb +81 -0
  150. data/spec/trema/vendor_spec.rb +76 -0
  151. data/spec/trema_spec.rb +56 -0
  152. data/src/examples/dumper/dumper.c +0 -8
  153. data/src/examples/dumper/dumper.rb +52 -52
  154. data/src/examples/hello_trema/hello_trema.c +0 -2
  155. data/src/examples/learning_switch/learning-switch.rb +3 -3
  156. data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
  157. data/src/examples/openflow_message/features-request.rb +3 -3
  158. data/src/examples/packetin_filter_config/utils.c +4 -4
  159. data/src/examples/repeater_hub/repeater-hub.rb +3 -3
  160. data/src/examples/switch_info/switch_info.rb +2 -2
  161. data/src/examples/switch_monitor/switch_monitor.c +1 -1
  162. data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
  163. data/src/lib/arp.h +4 -1
  164. data/src/lib/chibach.c +391 -0
  165. data/src/lib/chibach.h +71 -0
  166. data/src/lib/chibach_private.c +170 -0
  167. data/src/lib/chibach_private.h +52 -0
  168. data/src/lib/ether.c +2 -1
  169. data/src/lib/ether.h +0 -1
  170. data/src/lib/ipv4.h +13 -14
  171. data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
  172. data/src/lib/log.c +161 -58
  173. data/src/lib/log.h +11 -16
  174. data/src/lib/messenger.c +36 -1
  175. data/src/lib/messenger.h +1 -0
  176. data/src/lib/openflow_application_interface.c +128 -28
  177. data/src/lib/openflow_application_interface.h +31 -6
  178. data/src/lib/openflow_message.c +2 -1
  179. data/src/lib/openflow_service_interface.h +1 -0
  180. data/src/lib/openflow_switch_interface.c +1380 -0
  181. data/src/lib/openflow_switch_interface.h +264 -0
  182. data/src/lib/packet_info.c +94 -11
  183. data/src/lib/packet_info.h +22 -3
  184. data/src/lib/packet_parser.c +38 -2
  185. data/src/lib/secure_channel.c +498 -0
  186. data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
  187. data/src/lib/tcp.h +0 -3
  188. data/src/lib/trema.c +38 -5
  189. data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
  190. data/src/lib/trema_wrapper.c +5 -0
  191. data/src/lib/trema_wrapper.h +4 -0
  192. data/src/lib/utility.c +93 -4
  193. data/src/lib/utility.h +1 -0
  194. data/src/lib/wrapper.c +30 -7
  195. data/src/lib/wrapper.h +2 -0
  196. data/src/switch_manager/ofpmsg_recv.c +44 -30
  197. data/src/switch_manager/ofpmsg_send.c +40 -1
  198. data/src/switch_manager/ofpmsg_send.h +2 -0
  199. data/src/switch_manager/switch.c +153 -8
  200. data/src/switch_manager/switch.h +1 -0
  201. data/src/switch_manager/switchinfo.h +5 -0
  202. data/src/tremashark/README +2 -2
  203. data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
  204. data/trema +1 -1
  205. data/unittests/lib/log_test.c +158 -34
  206. data/unittests/lib/openflow_application_interface_test.c +252 -69
  207. data/unittests/lib/openflow_message_test.c +3 -1
  208. data/unittests/lib/packet_parser_test.c +60 -15
  209. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  210. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  211. data/unittests/lib/trema_test.c +2 -0
  212. data/unittests/lib/utility_test.c +65 -2
  213. data/unittests/lib/wrapper_test.c +29 -0
  214. data/vendor/{README → README.md} +2 -12
  215. data/vendor/packet-openflow.diff +13 -0
  216. metadata +86 -53
  217. data/GPL2 +0 -339
  218. data/ruby/trema/action-enqueue.c +0 -161
  219. data/ruby/trema/action-output.c +0 -169
  220. data/ruby/trema/action-set-dl-dst.c +0 -131
  221. data/ruby/trema/action-set-dl-dst.h +0 -44
  222. data/ruby/trema/action-set-dl-src.c +0 -131
  223. data/ruby/trema/action-set-nw-dst.c +0 -135
  224. data/ruby/trema/action-set-nw-src.c +0 -140
  225. data/ruby/trema/action-set-nw-tos.c +0 -124
  226. data/ruby/trema/action-set-nw-tos.h +0 -42
  227. data/ruby/trema/action-set-tp-dst.c +0 -122
  228. data/ruby/trema/action-set-tp-dst.h +0 -42
  229. data/ruby/trema/action-set-tp-src.c +0 -124
  230. data/ruby/trema/action-set-tp-src.h +0 -42
  231. data/ruby/trema/action-set-vlan-pcp.c +0 -128
  232. data/ruby/trema/action-set-vlan-pcp.h +0 -42
  233. data/ruby/trema/action-set-vlan-vid.c +0 -125
  234. data/ruby/trema/action-set-vlan-vid.h +0 -42
  235. data/ruby/trema/action-strip-vlan.c +0 -81
  236. data/ruby/trema/action-strip-vlan.h +0 -42
  237. data/ruby/trema/action-vendor.c +0 -121
  238. data/ruby/trema/vendor-request.c +0 -193
  239. data/spec/trema/action-enqueue_spec.rb +0 -100
  240. data/spec/trema/action-set-dl-dst_spec.rb +0 -95
  241. data/spec/trema/action-set-dl-src_spec.rb +0 -92
  242. data/spec/trema/action-set-nw-dst_spec.rb +0 -96
  243. data/spec/trema/action-set-nw-src_spec.rb +0 -97
  244. data/spec/trema/action-set-nw-tos_spec.rb +0 -88
  245. data/spec/trema/action-set-tp-dst_spec.rb +0 -88
  246. data/spec/trema/action-set-tp-src_spec.rb +0 -88
  247. data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
  248. data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
  249. data/spec/trema/action-vendor_spec.rb +0 -90
  250. 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
- shared_examples_for "any OpenFlow message with max_len option" do
26
- it_should_behave_like "any OpenFlow message", :option => :max_len, :name => "Maximum length", :size => 16
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 ActionOutput, ".new( VALID OPTIONS )" do
31
- subject { ActionOutput.new :port => port, :max_len => max_len }
32
- let( :port ) { 1 }
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
- describe ActionOutput, ".new( OPTIONAL OPTION MISSING ) - max_len" do
45
- subject { ActionOutput.new :port => 1 }
46
- its( :port ) { should == 1 }
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 ActionOutput, ".new( MANDATORY OPTION MISSING )" do
55
- it "should raise ArgumentError" do
56
- expect { subject }.to raise_error( ArgumentError )
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
- describe ActionOutput, ".new( INVALID OPTION ) - port" do
62
- subject { ActionOutput.new :port => port }
63
- it_should_behave_like "any OpenFlow message with port option"
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 ActionOutput, ".new( VALID OPTIONS )" do
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 => ActionOutput.new( :port => 1 ) )
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 => [ ActionOutput.new( :port => 1 ), ActionOutput.new( :port => 2 ) ] )
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: