trema 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -4,6 +4,8 @@ script: "rake travis"
4
4
 
5
5
  rvm:
6
6
  - 1.8.7
7
+ - 1.9.3
8
+ - 2.0.0
7
9
 
8
10
  branches:
9
11
  only:
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,12 @@
1
+ # Contributing to Trema
2
+
3
+ * Check out the latest develop to make sure the feature hasn't been
4
+ implemented or the bug hasn't been fixed yet.
5
+ * Check out the issue tracker to make sure someone already hasn't
6
+ requested it and/or contributed it.
7
+ * Fork the project.
8
+ * Commit and push until you are happy with your contribution.
9
+ * Make sure to add tests for it. This is important so I don't break it
10
+ in a future version unintentionally.
11
+ * Squash your commits.
12
+ * Create a pull-request.
data/Gemfile CHANGED
@@ -16,14 +16,16 @@ group :development do
16
16
  gem "aruba", "~> 0.5.3"
17
17
  gem "cucumber", "~> 1.3.8"
18
18
  gem "flay", "~> 2.4.0"
19
- gem "flog", "~> 4.1.2"
19
+ gem "flog", "~> 4.2.0"
20
20
  gem "rcov", "~> 1.0.0" if RUBY_VERSION < "1.9.0"
21
21
  gem "redcarpet", "~> 2.3.0" if RUBY_VERSION < "1.9.0"
22
22
  gem "redcarpet", "~> 3.0.0" if RUBY_VERSION >= "1.9.0"
23
- gem "reek", "~> 1.3.3"
23
+ gem "reek", "~> 1.3.4"
24
24
  gem "relish", "~> 0.7"
25
25
  gem "rspec", "~> 2.14.1"
26
- gem "yard", "~> 0.8.7.1"
26
+ gem "yard", "~> 0.8.7.2"
27
+ gem 'mime-types', '~> 1.25' if RUBY_VERSION < '1.9.0'
28
+ gem 'mime-types', '~> 2.0' if RUBY_VERSION >= '1.9.0'
27
29
  end
28
30
 
29
31
 
data/README.md CHANGED
@@ -49,15 +49,15 @@ Getting Started
49
49
  1.Install the prerequisites at the command prompt:
50
50
 
51
51
  (In Ubuntu or Debian GNU/Linux)
52
- $ sudo apt-get install gcc make ruby rubygems ruby-dev libpcap-dev libsqlite3-dev libglib2.0-dev
52
+ $ sudo apt-get install gcc make git ruby rubygems ruby-dev libpcap-dev libsqlite3-dev libglib2.0-dev
53
53
 
54
54
  (In Ubuntu 10.04)
55
- $ sudo apt-get install gcc make ruby rubygems ruby-dev libopenssl-ruby libpcap-dev libsqlite3-dev libglib2.0-dev
55
+ $ sudo apt-get install gcc make git ruby rubygems ruby-dev libopenssl-ruby libpcap-dev libsqlite3-dev libglib2.0-dev
56
56
  $ sudo gem install rubygems-update
57
57
  $ sudo /var/lib/gems/1.8/bin/update_rubygems
58
58
 
59
59
  (In Fedora 16-19)
60
- $ sudo yum install gcc make ruby rubygems ruby-devel libpcap-devel libsqlite3x-devel glib2-devel
60
+ $ sudo yum install gcc make git ruby rubygems ruby-devel libpcap-devel libsqlite3x-devel glib2-devel
61
61
 
62
62
  2.Install Trema at the command prompt:
63
63
 
data/Rakefile CHANGED
@@ -105,7 +105,7 @@ end
105
105
 
106
106
  desc "Build Trema Ruby library."
107
107
  task "rubylib" => "libtrema:static"
108
- PaperHouse::RubyLibraryTask.new "rubylib" do | task |
108
+ PaperHouse::RubyExtensionTask.new "rubylib" do | task |
109
109
  task.library_name = "trema"
110
110
  task.target_directory = Trema.ruby
111
111
  task.sources = "#{ Trema.ruby }/trema/*.c"
@@ -191,8 +191,8 @@ file Trema.openflow_h => Trema.objects do
191
191
  end
192
192
  directory Trema.objects
193
193
 
194
- CLOBBER.include File.join( Trema.objects, "openflow" )
195
- CLOBBER.include File.join( Trema.vendor_openflow )
194
+ CLOBBER.include( Trema.vendor_openflow ) if FileTest.exists?( Trema.vendor_openflow )
195
+ CLOBBER.include( File.join( Trema.objects, "openflow" ) ) if FileTest.exists?( File.join( Trema.objects, "openflow" ) )
196
196
 
197
197
 
198
198
  ################################################################################
@@ -205,6 +205,24 @@ def phost_src
205
205
  File.join Trema.vendor_phost, "src"
206
206
  end
207
207
 
208
+ def phost_objects
209
+ FileList[ File.join( phost_src, "*.o" ) ]
210
+ end
211
+
212
+ def phost_vendor_binary
213
+ File.join phost_src, "phost"
214
+ end
215
+
216
+ def phost_cli_vendor_binary
217
+ File.join phost_src, "cli"
218
+ end
219
+
220
+ def phost_clean_targets
221
+ ( phost_objects + [ phost_vendor_binary, phost_cli_vendor_binary ] ).select do | each |
222
+ FileTest.exists? each
223
+ end
224
+ end
225
+
208
226
  file Trema::Executables.phost do
209
227
  cd phost_src do
210
228
  sh "make"
@@ -221,10 +239,8 @@ file Trema::Executables.cli do
221
239
  install File.join( phost_src, "cli" ), Trema::Executables.cli, :mode => 0755
222
240
  end
223
241
 
224
- CLEAN.include FileList[ File.join( phost_src, "*.o" ) ]
225
- CLEAN.include File.join( phost_src, "phost" )
226
- CLEAN.include File.join( phost_src, "cli" )
227
- CLOBBER.include Trema.phost
242
+ CLEAN.include phost_clean_targets
243
+ CLOBBER.include( Trema.phost ) if FileTest.exists?( Trema.phost )
228
244
 
229
245
 
230
246
  ################################################################################
@@ -253,8 +269,8 @@ file Trema::Executables.ovs_openflowd do
253
269
  end
254
270
  end
255
271
 
256
- CLEAN.include Trema.vendor_openvswitch
257
- CLOBBER.include Trema.openvswitch
272
+ CLEAN.include( Trema.vendor_openvswitch ) if FileTest.exists?( Trema.vendor_openvswitch )
273
+ CLOBBER.include( Trema.openvswitch ) if FileTest.exists?( Trema.openvswitch )
258
274
 
259
275
 
260
276
  ################################################################################
@@ -298,8 +314,8 @@ file cbench_command => Trema.openflow_h do
298
314
  end
299
315
  end
300
316
 
301
- CLEAN.include Trema.oflops
302
- CLOBBER.include Trema.vendor_oflops
317
+ CLEAN.include( Trema.oflops ) if FileTest.exists?( Trema.oflops )
318
+ CLOBBER.include( Trema.vendor_oflops ) if FileTest.exists?( Trema.vendor_oflops )
303
319
 
304
320
 
305
321
  ################################################################################
@@ -315,8 +331,8 @@ file Trema.libcmockery_a do
315
331
  end
316
332
  end
317
333
 
318
- CLEAN.include Trema.vendor_cmockery
319
- CLOBBER.include Trema.cmockery
334
+ CLEAN.include( Trema.vendor_cmockery ) if FileTest.exists?( Trema.vendor_cmockery )
335
+ CLOBBER.include( Trema.cmockery ) if FileTest.exists?( Trema.cmockery )
320
336
 
321
337
 
322
338
  ################################################################################
@@ -736,7 +752,7 @@ directory $wireshark_plugins_dir
736
752
 
737
753
  task :openflow_wireshark_plugin => $wireshark_plugin
738
754
 
739
- CLEAN.include Trema.vendor_openflow_git
755
+ CLEAN.include( Trema.vendor_openflow_git ) if FileTest.exists?( Trema.vendor_openflow_git )
740
756
 
741
757
 
742
758
  ################################################################################
data/bin/trema CHANGED
@@ -60,6 +60,9 @@ class BinTrema
60
60
  c.desc "Specifies emulated network configuration"
61
61
  c.flag [ :c, :conf ]
62
62
 
63
+ c.desc "Disables initial flow cleanup for a connected switch"
64
+ c.switch [ :r, :no_flow_cleanup ], :negatable => false
65
+
63
66
  c.action do | global_options, options, args |
64
67
  trema_run options
65
68
  end
data/cruise.rb CHANGED
@@ -24,7 +24,7 @@
24
24
  # threshold.
25
25
  #
26
26
 
27
- $coverage_threshold = 70.2
27
+ $coverage_threshold = 70.0
28
28
 
29
29
 
30
30
  ################################################################################
@@ -17,7 +17,7 @@ Feature: "Switch Monitor" sample application
17
17
  Given I run `trema run ../../objects/examples/switch_monitor/switch_monitor -c switch_monitor.conf -d`
18
18
  And wait until "switch_monitor" is up
19
19
  When I run `trema kill 0x3`
20
- And *** sleep 1 ***
20
+ And *** sleep 2 ***
21
21
  Then the file "../../tmp/log/switch_monitor.log" should contain "Switch 0x3 is DOWN"
22
22
  When I run `trema up 0x3`
23
23
  And *** sleep 10 ***
@@ -28,7 +28,7 @@ Feature: "Switch Monitor" sample application
28
28
  Given I run `trema run ../../src/examples/switch_monitor/switch-monitor.rb -c switch_monitor.conf -d`
29
29
  And wait until "SwitchMonitor" is up
30
30
  When I run `trema kill 0x3`
31
- And *** sleep 1 ***
31
+ And *** sleep 2 ***
32
32
  Then the file "../../tmp/log/SwitchMonitor.log" should contain "Switch 0x3 is DOWN"
33
33
  When I run `trema up 0x3`
34
34
  And *** sleep 10 ***
@@ -1,4 +1,3 @@
1
- @wip
2
1
  Feature: Ruby methods for adding switch event forwarding entry
3
2
 
4
3
  There are three Ruby methods provided for adding switch event forwarding entries:
@@ -1,4 +1,3 @@
1
- @wip
2
1
  Feature: Ruby methods for deleting switch event forwarding entry
3
2
 
4
3
  There are three Ruby methods provided for deleting switch event forwarding entries.
@@ -1,4 +1,3 @@
1
- @wip
2
1
  Feature: Ruby methods for dumping switch event forwarding entry
3
2
 
4
3
  There are two Ruby methods provided for dumping switch event forwarding entry.
@@ -1,4 +1,3 @@
1
- @wip
2
1
  Feature: Ruby methods for setting switch event forwarding entry
3
2
 
4
3
  There are two Ruby methods provided for setting switch event forwarding entry.
@@ -34,6 +34,9 @@ module Trema
34
34
  if options[ :tremashark ]
35
35
  $use_tremashark = true
36
36
  end
37
+ if options[ :no_flow_cleanup ]
38
+ $no_flow_cleanup = true
39
+ end
37
40
 
38
41
  need_cleanup = ( not running? )
39
42
 
@@ -73,6 +73,7 @@ module Trema
73
73
  end
74
74
  SwitchManager.new( rule, @context.port )
75
75
  end
76
+ switch_manager.no_flow_cleanup = true if $no_flow_cleanup
76
77
  switch_manager.run!
77
78
  end
78
79
 
data/ruby/trema/mac.rb CHANGED
@@ -16,154 +16,12 @@
16
16
  #
17
17
 
18
18
 
19
- require "forwardable"
19
+ require "rubygems"
20
+ require "pio"
20
21
 
21
22
 
22
23
  module Trema
23
- #
24
- # Ethernet address class
25
- #
26
- class Mac
27
- extend Forwardable
28
- def_delegator :@value, :hash
29
-
30
-
31
- #
32
- # Returns an Ethernet address in its numeric presentation.
33
- #
34
- # @example
35
- # Mac.new("11:22:33:44:55:66") #=> 18838586676582
36
- #
37
- # @return [Number] the Ethernet address in numeric format
38
- #
39
- attr_reader :value
40
-
41
-
42
- #
43
- # Creates a {Mac} instance that encapsulates Ethernet addresses.
44
- #
45
- # @overload initialize(value)
46
- #
47
- # @param [String,Integer] value
48
- # the Ethernet address to set to.
49
- #
50
- # @example address as a hexadecimal string
51
- # Mac.new("11:22:33:44:55:66")
52
- #
53
- # @example address as a hexadecimal number
54
- # Mac.new(0xffffffffffff)
55
- #
56
- # @raise [ArgumentError] if invalid format is detected.
57
- # @raise [TypeError] if supplied argument is not a String or Integer.
58
- #
59
- def initialize value
60
- case value
61
- when String
62
- @value = create_from( value )
63
- when Integer
64
- @value = value
65
- validate_value_range
66
- when Mac
67
- @value = create_from( value.to_s )
68
- else
69
- raise TypeError, "Invalid MAC address: #{ value.inspect }"
70
- end
71
- @string = string_format
72
- end
73
-
74
-
75
- #
76
- # Returns the Ethernet address as 6 pairs of hexadecimal digits
77
- # delimited by colons.
78
- #
79
- # @example
80
- # Mac.new(18838586676582).to_s #=> "11:22:33:44:55:66"
81
- #
82
- # @return [String] the Ethernet address in String format
83
- #
84
- def to_s
85
- @string
86
- end
87
-
88
-
89
- #
90
- # Returns an array of decimal numbers converted from Ethernet's
91
- # address string format.
92
- #
93
- # @example
94
- # Mac.new("11:22:33:44:55:66").to_a #=> [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ]
95
- #
96
- # @return [Array] the Ethernet address in Array format
97
- #
98
- def to_a
99
- @string.split( ":" ).collect do | each |
100
- each.hex
101
- end
102
- end
103
-
104
-
105
- #
106
- # @private
107
- #
108
- def == other
109
- @value == other.value
110
- end
111
- alias :eql? :==
112
-
113
-
114
- #
115
- # Returns true if Ethernet address is a multicast address.
116
- #
117
- # @example
118
- # Mac.new("01:00:00:00:00:00").multicast? #=> true
119
- # Mac.new("00:00:00:00:00:00").multicast? #=> false
120
- #
121
- # @return [Boolean] whether the Ethernet address is multicast
122
- #
123
- def multicast?
124
- to_a[ 0 ] & 1 == 1
125
- end
126
-
127
-
128
- #
129
- # Returns true if Ethernet address is a broadcast address.
130
- #
131
- # @example
132
- # Mac.new("ff:ff:ff:ff:ff:ff").broadcast? #=> true
133
- #
134
- # @return [Boolean] whether the Ethernet address is broadcast
135
- #
136
- def broadcast?
137
- to_a.all? { | each | each == 0xff }
138
- end
139
-
140
-
141
- ################################################################################
142
- private
143
- ################################################################################
144
-
145
-
146
- def create_from string
147
- octet_regex = "[0-9a-fA-F][0-9a-fA-F]"
148
- if /^(#{ octet_regex }:){5}(#{ octet_regex })$/=~ string
149
- string.gsub( ":", "" ).hex
150
- else
151
- raise ArgumentError, %{Invalid MAC address: "#{ string }"}
152
- end
153
- end
154
-
155
-
156
- def validate_value_range
157
- unless ( @value >= 0 and @value <= 0xffffffffffff )
158
- raise ArgumentError, "Invalid MAC address: #{ @value }"
159
- end
160
- end
161
-
162
-
163
- def string_format
164
- sprintf( "%012x", @value ).unpack( "a2" * 6 ).join( ":" )
165
- end
166
- end
24
+ Mac = Pio::Mac
167
25
  end
168
26
 
169
27
 
@@ -172,3 +30,4 @@ end
172
30
  ### coding: utf-8-unix
173
31
  ### indent-tabs-mode: nil
174
32
  ### End:
33
+
data/ruby/trema/match.c CHANGED
@@ -238,7 +238,7 @@ match_dl( VALUE self, uint8_t which ) {
238
238
  else {
239
239
  dl_addr = match->dl_dst;
240
240
  }
241
- return rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, ULL2NUM( mac_to_uint64( dl_addr ) ) );
241
+ return rb_funcall( rb_eval_string( "Pio::Mac" ), rb_intern( "new" ), 1, ULL2NUM( mac_to_uint64( dl_addr ) ) );
242
242
  }
243
243
 
244
244
 
@@ -395,16 +395,16 @@ match_tp_dst( VALUE self ) {
395
395
  * @option options [Number] :in_port
396
396
  * the physical port number to match.
397
397
  *
398
- * @option options [String,Number,Trema::Mac] :dl_src
398
+ * @option options [String,Number,Mac] :dl_src
399
399
  * the source ethernet address to match specified either as 6
400
400
  * pairs of hexadecimal digits delimited by colon or as a
401
- * hexadecimal number or as a Trema::Mac object.
401
+ * hexadecimal number or as a Mac object.
402
402
  * (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
403
403
  *
404
404
  * @option options [String,Number] :dl_dst
405
405
  * the destination ethernet address to match specified either as a
406
406
  * 6 pairs of hexadecimal digits delimited by colon or as a
407
- * hexadecimal number or as a Trema::Mac object.
407
+ * hexadecimal number or as a Mac object.
408
408
  * (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
409
409
  *
410
410
  * @option options [Number] :dl_type
@@ -472,11 +472,11 @@ match_init( int argc, VALUE *argv, VALUE self ) {
472
472
  VALUE dl_src = rb_hash_aref( options, ID2SYM( rb_intern( "dl_src" ) ) );
473
473
  if ( dl_src != Qnil ) {
474
474
  VALUE dl_addr;
475
- if ( rb_obj_is_kind_of( dl_src, rb_eval_string( "Trema::Mac" ) ) ) {
475
+ if ( rb_obj_is_kind_of( dl_src, rb_eval_string( "Pio::Mac" ) ) ) {
476
476
  dl_addr = dl_src;
477
477
  }
478
478
  else {
479
- dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_src );
479
+ dl_addr = rb_funcall( rb_eval_string( "Pio::Mac" ), rb_intern( "new" ), 1, dl_src );
480
480
  }
481
481
  dl_addr_to_a( dl_addr, match->dl_src );
482
482
  match->wildcards &= ( uint32_t ) ~OFPFW_DL_SRC;
@@ -485,11 +485,11 @@ match_init( int argc, VALUE *argv, VALUE self ) {
485
485
  VALUE dl_dst = rb_hash_aref( options, ID2SYM( rb_intern( "dl_dst" ) ) );
486
486
  if ( dl_dst != Qnil ) {
487
487
  VALUE dl_addr;
488
- if ( rb_obj_is_kind_of( dl_dst, rb_eval_string( "Trema::Mac" ) ) ) {
488
+ if ( rb_obj_is_kind_of( dl_dst, rb_eval_string( "Pio::Mac" ) ) ) {
489
489
  dl_addr = dl_dst;
490
490
  }
491
491
  else {
492
- dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_dst );
492
+ dl_addr = rb_funcall( rb_eval_string( "Pio::Mac" ), rb_intern( "new" ), 1, dl_dst );
493
493
  }
494
494
  dl_addr_to_a( dl_addr, match->dl_dst );
495
495
  match->wildcards &= ( uint32_t ) ~OFPFW_DL_DST;